Methoden Arrays vergleichen

djjava

Mitglied
Hey!

Möchte ein Programm schreiben das Lottozahlen ausgibt(6 aus 45).
Der Benutzer soll eingeben können wie viele Tipps er generieren will.
Anschließend werden so viele Tipps wie der Benutzer wünscht generiert.
Mein Problem liegt darin, alle Tipps miteinander zu vergleichen, sodass kein Tipp zweimal vorkommt.
Wie setze ich das um????

Mein Code bis jetzt:
Java:
public class UE_03_c_Lottozahlen_2 {
	public static void main(String[] args) {
System.out.println(test());
}
	public static String test(){
		String neu="";
		String arrays="";
		
		for(int i=0; i<4;i++){
				String [] tipp = generateLottoTipp();
				
				neu = Arrays.deepToString(tipp);
				arrays = arrays+neu+"";
			
			
		
		}return arrays;
	}

	private static String[] generateLottoTipp() {
		
		String[] tipp;
		tipp=new String[6];
		boolean[] lottozahlen=new boolean[46];

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

			while(true){		
				neuerTipp = (int) (Math.random()*45+1);
				
				if(!(lottozahlen[neuerTipp])){
					break;
				}
			}
			lottozahlen[neuerTipp]=true;
			tipp[i]=neuerTipp+"";
		}
		
		Arrays.sort(tipp);
		return tipp;
	}
}
 
Also ich würde die Tipps vorher nach Größe der einzelnen Zahlen sortieren und dann den neu generierten, vollständigen sechser Tipp mithilfe von .equals(String) mit den älteren vergleichen. Sollte der neue einem älteren entsprechen (.equals() gibt true zurück) dann muss der sechser Tipp nochmal generiert werden. Solange, bis .equals() nicht mehr true zurückgibt.
 
Du kannst auch ein HashSet verwenden um sicherzustellen, dass kein Tipp doppelt vorkommt. Ausserdem würde ich die Tipps als ArrayList zurückgeben, nicht als Strings.

Java:
private static ArrayList<Integer> generateLottoTipp() {
    ArrayList<Integer> tipp = new ArrayList<>();
    for(int i = 1; i <= 45; i++) tipp.add(i);
    Collections.shuffle(tipp);
    tipp.subList(6, 45).clear();
    Collections.sort(tipp);
    return tipp;
}

public static ArrayList<ArrayList<Integer>> test(int n) {
    HashSet<ArrayList<Integer>> set = new HashSet<>();
    while(set.size() < n) set.add(generateLottoTipp());
    return new ArrayList<ArrayList<Integer>>(set);
}

public static void main(String[] args) {
    for(ArrayList<Integer> tipp: test(6)) {
        System.out.println(tipp);
    }
}
 
Zuletzt bearbeitet:
Also ich finde meine gebastelte Klasse ist recht überschaubar 🙂
Sie braucht für 1 Million Lottotipps (keine Duplikate) ca. 10 Sekunden (alter Rechner, recht schlechte CPU).

Java:
import java.util.TreeSet;

public class Zufall {

	public static void main(String[] args) {
		Integer versuche = Integer.parseInt(args[0]);
		TreeSet<String> tipps = new TreeSet<String>();

		/*
		 * Hier werden die 6 Lottozahlen der Liste hinzugefügt
		 */
		do {
			String lottozahlen = generateLottoTipp();
			tipps.add(lottozahlen);

			System.out.println(lottozahlen);
		}
		while (tipps.size() != versuche);
	}

	private static int random (Integer von, Integer bis) {
		/*
		 * Math.random() erzeugt einen Zufallswert zwischen 0 und 1.
		 * Das Ergebnis multiplizieren wir mit bis-von (45-1 = 44)
		 * Dann entfernen wir die Nachkommastellen (durch den typecast auf int).
		 * Jetzt erhalten wir ein Ergebnis, das von 0 bis 44 geht.
		 * Danach müssen wir noch "von" draufrechnen, damit das Ergebnis 
		 * um die richtigen Stellen verschoben wird.
		 * In diesem Falle um 1 Stelle, also 1 bis 45.
		 */
		return von + (int)(Math.random() * (bis-von));
	}

	private static String generateLottoTipp() {
		TreeSet<Integer> lottozahlen = new TreeSet<Integer>();

		/*
		 * Wir erzeugen solange Zahlen, bis wir 6 verschiedene zusammen haben.
		 */
		while (lottozahlen.size() != 6) {
			int random = random(1, 45);
			lottozahlen.add(random);
		}

		return lottozahlen.toString();
    }
}

Sicherlich ist da auch noch einiges an Optimierungspotenzial. Man könnte z.B. die generateMethode noch soweit verschärfen, dass sie gewisse Wertemengen nicht zulässt, um eine höhere Chance zu erzielen, dass die 6 zufälligen Zahlen nicht schon bei den Tipps vorhanden sind.
 
Zuletzt bearbeitet:
Wo überprüfst du, ob die Zahlen innerhalb des Tipps nicht schon einmal vorgekommen sind? Da böte sich womöglich eine LinkedList an, welche du einmal am Anfang mit Zahlen von 1-45 füllst und dann nur noch für jeden neuen Tipp neu holst. Daraus holst du dann die Zahlen und löschst die geholten Zahlen. Danach holst du die Liste wieder und machst das gleiche, bis genug Tipps generiert wurden.

Und eine Frage noch: Wo checkst du, ob der Tipp schon einmal vorgekommen ist?

Aber 10 Sekunden auf einem eher bescheidenen Rechner und mit einem Java-Programm. Wie lange braucht dann ein C++ Programm auf einem Gamer PC? Zwei Sekunden?
 
Auf nem Gamer PC benötigt das Java Programm schon weniger als 1 Sekunde für 1 Million Tipps. Mit ein paar Optimierungen kann man es sogar auf 0,2 Sekunden bringen.
 
Zuletzt bearbeitet:
Leute danke fuer eure bemuehungen....leider kennen ich mich nicht sogut aus , deshalb wollte ich das array in einen String umwandeln und dann schauen ob es in dem neu zusammengebauten String enthalten ist. Wie wuerde so etwas in Codeform ausschauen?

Danke schonmal !
 
Das geht mit String.contains(expression);

Java:
arrayVariable.toString().contains(neuerTipp);

Und eine Frage noch: Wo checkst du, ob der Tipp schon einmal vorgekommen ist?


Das macht das TreeSet für mich 😉
Das ist eine Mischung aus HashSet (keine Duplikate) und einer TreeMap (geordnete Werte)
 
Zuletzt bearbeitet:
Okay danke ....Jetzt habe ich einen String mit sechs Zahlen...den vergleiche ich mit dem Tippps davor. Wennn einen Tipp gleich ist si generiere ich einen neuen. Also brauche ich ein If mit eqalse abfrage. Nur wie kann ich danach den tipp wieder neu genierienen. Komme ja nicht mehr zurueck zu dem Code wo der Tipp enstanden ist.
 
Leute danke fuer eure bemuehungen....leider kennen ich mich nicht sogut aus , deshalb wollte ich das array in einen String umwandeln und dann schauen ob es in dem neu zusammengebauten String enthalten ist. Wie wuerde so etwas in Codeform ausschauen?

Danke schonmal !

Also das ist eine sehr schlechte idee, du kannst ja nicht prüfen ob 2 enthalten ist wenn 20 schon drinnen ist...
Warum machst du dir nicht einfach eine Methode die überprüft ob eine zahl schon in dem Array enthalten ist? Jede Zahl mit der zu suchenden vergleiche, wenn du einnen Treffer hast true zurück geben, wenn du keinen hast false...



Java:
public static boolean contains(int toSearchFor, int[] vales){
        for(int v : vales){
            if(v == toSearchFor){
                return true;
            }
        }
        return false;
    }
 

Neue Themen


Zurück
Oben