2009-06-18 2 views
5

Sto provando a generare una matrice int a 5 cifre in Java e sto avendo problemi su dove iniziare. Nessuno dei numeri nell'array può essere duplicato. Posso generare numeri casuali per bene, ma non riesco a capire come confrontare i numeri tra loro e sostituire eventuali duplicati.Confronto di elementi in una matrice per i duplicati

+2

che cosa si intende per 'int array di 5 cifre'? –

risposta

10

È possibile utilizzare un java.util.Set anziché un array poiché è garantito che abbia solo elementi univoci.

1

provare questo:

int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
Random random = new Random(); 

int[] generateId() { 
    int[] clone = digits.clone(); 
    int[] id = new int[5]; 

    for (int i = 0; i < 5; i++) { 
     int candidate; 

     do { 
      candidate = random.nextInt(10); 
     } while (clone[candidate] == -1); 

     id[i] = clone[candidate]; 
     clone[candidate] = -1; 
    } 

    return id; 
} 
2

Si può sbarazzarsi dei duplicati convertendo l'array in un TreeSet (che sarà anche ordinarli):

int numbers[] { 4 5 7 6 5 7 5 89 847 7 94 093 02 10 11 10 11 }; 
TreeSet set new TreeSet(Arrays.asList(numbers)); 
for (int no : set) 
    System.out.println(no); 
4

Se ho capito bene, si vuoi un numero casuale a 5 cifre, senza cifre ripetute?

In tal caso, un modo è quello di mescolare un elenco delle cifre da 0 a 9, quindi selezionare i primi 5 elementi.

EDIT

Integer[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
Random random = new Random(); 

public Integer[] generateId() { 
    List<Integer> id = Arrays.asList(digits); 
    Collections.shuffle(id, random); 
    return id.subList(0, 5).toArray(new Integer[0]); 
} 
2

questo genera in O (numero di cifre), nessun cicli interni, senza mischiare < - questo potrebbe essere costoso se il numero di scelte diventa veramente grande

int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
Random random = new Random(); 

int[] generateId() { 
    int[] choices = digits.clone(); 
    int[] id = new int[5]; 

    for (int i = 0; i < 5; i++) { 
     // one less choice to choose from each time 
     int index = random.nextInt(choices.length - i); 
     id[i] = choices[index]; 
     // "remove" used item by replacing it with item at end of range 
     // because that index at the end won't be considered in next round 
     choices[index] = choices[choices.length - i - 1]; 
    } 

    return id; 
} 
1

In alternativa, basta ordinare l'array e iterarlo.

List<int> myList = new List<int>() { 1, 1, 2, 3, 4, 5, 5, 7 , 1, 7}; 
    myList.Sort(); 
    for (int i = myList.Count - 1; i > 0; i--) 
    { 
     if (myList[i] == myList[i - 1]) 
      myList.RemoveAt(i); 
    } 

Ma ovviamente è meglio non ottenere duplicati per iniziare.

0

Prima di tutto voglio ringraziare tutti voi per l'aiuto, lo apprezzo davvero.

Ho ottenuto questo programma per funzionare nel modo in cui voglio ma sembra che ci dovrebbe essere un modo più semplice però. Ecco cosa ho fatto. Qualsiasi altro commento sarebbe fantastico.

do 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      iNumber = generator.nextInt(9) + 1; 
      numbers[i] = iNumber; 
     } 
    } 
    while(numbers[0] == numbers[1] || numbers[0] == numbers[2] || numbers[0] == numbers[3] || numbers[0] == numbers[4] || numbers[1] == numbers[2] || numbers[1] == numbers[3] || numbers[1] == numbers[4] || numbers[2] == numbers[3] || numbers[2] == numbers[4] || numbers[3] == numbers[4]); 
+0

Guarda, genera solo numeri casuali e li inserisce in un Set mentre la dimensione è inferiore o uguale a 5. Quindi chiama il metodo toArray per esportarli in un aray. Ovviamente, la matrice conterrà numeri interi, non interi – Sandman

+0

@sandman: non so se sia una buona idea, poiché Set non dà garanzie sull'ordine restituisce gli elementi AFAIK. @ John: ci sono almeno due soluzioni più pulite proposte in questo thread? –

+0

@sventek: non mi sono reso conto che i numeri devono essere ordinati? In tal caso, suggerisco di utilizzare un SortedSet. Rende gli inserti più costosi, ma ritengo comunque che questa sia una soluzione piuttosto buona. – Sandman

0
/** 
* findDuplicate method return map where key is unique no and value as the 
* repitation 
* 
* @param a 
*   : arrays of Objects 
* @return map 
*/ 
public Map findDuplicate(T[] a) { 
    Map<T, Integer> map = new HashMap<T, Integer>(); 
    Set<T> unique = new HashSet<T>(Arrays.asList(a)); 
    int count = 0; 
    for (T integer : unique) { 
     for (T integer1 : a) { 
      if (integer == integer1) { 
       ++count; 
      } 
     } 
     map.put(integer, count); 
     count = 0; 
    } 

    return map; 
}