# Array untereinander auf Duplikate prüfen



## EFChris (16. Jan 2012)

Hallo liebe Community,
ich muss grad in der Schule ein eigenes Java Projekt machen. Nun habe ich mir zur Aufgabe gemacht, ein virtuelles Lottospiel zu programieren.
Soweit läuft auch alles ganz gut.
Doch im Moment bin ich auf ein Problem gestoßen. Und zwar bekommt der Spieler einen Tippschein angezeigt, wo er in 6 Felder (jNumberField) seine persönlichen Glückszahlen eingeben soll.
Nun darf er natürlich jede Zahl nur EINMAL verwenden. Und da ist auch schon mein Problem. Denn ich komme einfach nicht auf eine effiziente Lösung diese Zahlen miteinander zu vergleichen.
Da die Reihenfolge der Zahlen eine Rolle spielt, weiß ich auch nicht inwiefern es mit vorherigem Sortieren funktioniert.

Angefangen hatte ich so:


```
for (i=0; i<=5; i++) {
      for (k=1; k<=5; k++) {
       if (tipp[i] == tipp[k]) {
          System.out.println("Sie dürfen jede Zahl nur EINMAL eingeben.");
        }
      }
}
```

Aber hierbei wird glaub ich jede Zahl mit sich selbst verglichen. Zumindest bekomme ich die Ausgabe "Sie dürfen jede Zahl nur EINMAL eingeben." gleich 6 mal ausgegeben.

Für Hilfe wäre ich sehr dankbar.

Mfg Chris


----------



## Gast2 (16. Jan 2012)

```
for (i=0; i<=5; i++) {
  for (k=1; k<=5; k++) {
    if (i == k) continue;
    if (tipp[i] == tipp[k]) {
      System.out.println("Sie dürfen jede Zahl nur EINMAL eingeben.");
      }
  }
}
```


----------



## EFChris (16. Jan 2012)

Oh wahnsinn ging das schnell!
Und es funktioniert sogar  Danke Schön

Und damit ich nich gleich noch ein Thread aufmache:
Könnte mir vllt auch jemand sagen, wie ich definieren kann, was der Benutzer eingeben darf.
Weil er darf nur Zahlen zwischen 1 und 49 eingeben. Am besten wäre es wenn sich das Feld rot färbt bei falscher Eingabe und eine Fehlermeldung anzeigt. (Rot färbt bis jetzt nur wenn man Buchstaben eingibt. Aber das ist bei dem jNumberField gleich von Hause aus so).

VIELEN DANK


----------



## JanHH (17. Jan 2012)

Der Korrektheit halber sei aber erwähnt dass der algorithmus das Problem nicht gerade elegant löst. Man braucht ja immer n-Quadrat vergleiche. Bei 6 Zahlen geht das ja noch, aber bei 1000 oder 10.000 macht sichs dann doch bemerkbar. Ich würde das Array einmal durchgehen und die Zahlen in einem Set speichern.

```
Set set=new HashSet();
for(int i=0;i<6;i++)
{
   Integer k=new Integer(tipp[i]);
   if(set.contains(k))
       System.out.println("Sie dürfen jede Zahl nur EINMAL eingeben.");
   else
      set.add(k);
}
```


----------



## Zeeu (17. Jan 2012)

ne hash hatte mit sprungmarken gearbeitet oder ? also On 1?


----------



## Landei (17. Jan 2012)

Eine Hash-Tabelle ohne Kollisionen würde mit O(1) arbeiten, mit Kollisionen ist dann im Schnitt O(log n). Natürlich hat man im Worst-Case (alle Hashwerte sind gleich) O(n). Siehe Hashtabelle ? Wikipedia


----------



## EFChris (4. Mrz 2012)

Vielen Dank für die vielen Antworten. Sie waren sehr nützlich.
So habe ich das Problem jetzt gelöst:


```
if (eingabe==1) {
      for (i=0; i<=4; i++) {
        for (k=i+1; k<=5; k++) {
          if (tipp[i] == tipp[k]) {
            JOptionPane.showMessageDialog(null, "Sie dürfen jede Zahl nur einmal eingeben.", "Fehlermeldung", JOptionPane.ERROR_MESSAGE); //Bei Doppeleinträgen öffnet sich eine Fehlermeldung
            eingabe = 2;
          }
        }
      }

      for (n=0; n<=5; n++) {
        if (tipp[n]>49) {
           JOptionPane.showMessageDialog(null, "Sie dürfen nur Zahlen zwischen 1 und 49 eingeben.", "Fehlermeldung", JOptionPane.ERROR_MESSAGE);
           eingabe = 2;
        }
      }

      
      if (sz>9) {
        JOptionPane.showMessageDialog(null, "Sie müssen eine Zusatzzahl zwischen 1 und 9 wählen.", "Fehlermeldung", JOptionPane.ERROR_MESSAGE);
        eingabe = 2;
      }
      
    }
    
    if (eingabe==2) {
     new Tippschein("Tippschein");
     this.dispose();
     } else {
     new Ziehung("Ziehung");
     this.dispose();

     }
```


----------



## HimBromBeere (4. Mrz 2012)

> [JAVA=2]
> for (i=0; i<=4; i++) {
> for (k=i+1; k<=5; k++) {[/code]


Das macht keinen Sinn. Hiermit entzeihst du die Möglichkeit, die ersten Elemente ebenfalls zu überprüfen. Stell dir vor, wir befinden uns im zweiten Durchlauf der äußeren Schleife (i = 1, k = 1 + 1 = 2). Jetzt kannst du deine Elemente nur noch mit der zweiten Zeile vergleichen, aber mit der allerersten (Index 0) nicht mehr. Heißt: dein k muss genauso bei 0 (oder 1 wegen Dopplung) beginnen und durch das ganze Feld laufen.

EDIT: Ist es gewollt, dass du in Zeile 11ff nur die ersten fünf Elemente deines Tippscheines auf <49 überprüfst?


----------



## EFChris (4. Mrz 2012)

So funktioniert es aber.
Hatte vorher das Problem, dass ich bei einer Dopplung die Fehlermeldung 2x bekommen hab. Jetzt passiert das nicht mehr

EDIT: Es werden aber alle 6 Elemente überprüft. Das Array Ziehung geht doch von 0 - 5 (0,1,2,3,4,5) und das sind 6 Elemente


----------

