Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
Java:
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.
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.");
}
}
}
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).
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.
Java:
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);
}
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
Vielen Dank für die vielen Antworten. Sie waren sehr nützlich.
So habe ich das Problem jetzt gelöst:
Java:
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();
}
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?