2009-06-18 12 views
5

Ich versuche, ein 5-stelliges int-Array in Java zu generieren und habe Probleme beim Start. Keine der Zahlen im Array kann Duplikate sein. Ich kann Zufallszahlen dafür erzeugen, aber ich kann einfach nicht herausfinden, wie man die Zahlen miteinander vergleicht und Duplikate ersetzt.Vergleichen Sie Elemente in einem Array für Duplikate

+2

was meinst du mit '5-stellige int array'? –

Antwort

10

Sie können ein java.util.Set anstelle eines Arrays verwenden, da es garantiert nur eindeutige Elemente enthält.

1

versuchen Sie dies:

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

Sie können durch die Umwandlung der Anordnung in eine TreeSet der Duplikate loswerden (das wird sie auch sortieren):

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

Wenn ich Sie richtig verstehe, Sie Willst du eine zufällige 5-stellige Nummer, ohne wiederholte Zahl?

Wenn ja, besteht eine Möglichkeit darin, eine Liste der Ziffern 0-9 zu mischen und dann die ersten 5 Elemente auszuwählen.

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

dies erzeugt es in O (Anzahl der Stellen), keine inneren Schleifen, keine schlurfenden < - dies teuer sein könnte, wenn die Anzahl der Entscheidungen wirklich groß wird

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

Als Alternative, einfach das Array sortieren und iterieren.

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); 
    } 

Aber natürlich ist es am besten, keine Duplikate zu bekommen, um damit zu beginnen.

0

Zunächst möchte ich Ihnen allen danken, dass Sie mir geholfen haben.

Ich habe dieses Programm so, wie ich will, aber es scheint, als sollte es einen einfacheren Weg geben. Hier ist was ich getan habe. Noch mehr Kommentare wären toll.

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

Schauen Sie, erzeugen Sie einfach Zufallszahlen und setzen Sie sie in ein Set , während seine Größe kleiner oder gleich 5 ist. Dann rufen Sie es zuArray Methode, um sie in ein Array zu exportieren. Natürlich enthält das Array Integer, keine Ints – Sandman

+0

@sandman: Ich weiß nicht, ob das eine gute Idee ist, da Set gibt keine Garantien über die Reihenfolge gibt es Elemente AFAIK zurück. @ John: Es gibt mindestens zwei sauberere Lösungen in diesem Thread vorgeschlagen? –

+0

@sventek: Ich habe nicht bemerkt, dass die Nummern bestellt werden müssen? In diesem Fall empfehle ich, ein SortedSet zu verwenden. Es macht Einfügungen teurer, aber ich glaube immer noch, dass dies eine ziemlich gute Lösung ist. – 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; 
} 
Verwandte Themen