Zwei ArrayListen mit einander vergleichen

Joew0815

Bekanntes Mitglied
Hallo!
Ich programmier gerade ein Spiel und möchte zwei Listen auf ihren Inhalt prüfen. Nur leider scheint ein simples "if" mit "==" nicht auszureichen.
Hier ein Teil von meinem Code (wenn mehr von nöten ist post ich alles 😉 )

Java:
if(Greenfoot.mouseClicked(ri)) { //Prüft ob auf RedIn geklickt wurde
                //if(Greenfoot.mouseClicked(null)) { //Prüft ob auf RedIn geklickt wurde
                //if(m.getActor() == ri) { //Prüft ob auf RedIn geklickt wurde
                //if(m.getX() < 250) { //Prüft ob auf RedIn geklickt wurde
                player.add(1); //in die Player Liste wird "1" für Rot gesetzt
                setRed();

                if(game == player) //Wenn game und player Liste übereinstimmen ...
                {
                    Spielende = false; //... bleibt das Spielende false ...
                    sequenz = runden + 1; /** Wird sequenz um 1 erhöht
                     * sorgt dafür das die anfangsschleife nicht
                     * unterbrochen und fortgeführt wird
                     */
                    beg = 0;
                }
                else {Spielende = true; //.. wenn nicht, tritt das Spielende ein
                }
            }

Es geht um die Listen "game" und "player". In beiden stehen gleiche datentypen drin (Zahlen von 0 bis 3).
Wie gehts richtig?
 
Code:
==
prüft die Identität der Liste.
Code:
equals
prüft die Listen auf gleichheit.
 
Ich hab ein neues Problem mit dem Vergleichen:

Es ist so das die game Liste pro Runde immer um 1 mehr von der player Liste abweicht. Das Problem nun: Wenn z. B. in der Liste game (die zuerst vom Programm ausgefüllt wird), 0 und 2 drinsteht und ich erst auf 0 klicke (also 0 in die player Liste eingetragen wird) erkennt dies als falsch, also player Liste entspricht nicht gamer Liste.
Habe versucht das Problem mit dem zusatz:

&& game.size() == player.size()

zu lösen, allerdings klappt dies nicht. Erklärung? 😀
 
Wenn sie eh immer um die Länge 1 abweicht, wie willst du da Gleichheit definieren, bzw was willst du dann genau prüfen?! Ob die kleinere in der größeren enthalten ist?! Wie sollen die Ergebnisse der Prüfung aussehen für die jeweiligen Fälle (gleichlange Listen, unterschiedlich lange Listen, Inhalte etc.)
 
Also Beispiel:
Das Spiel setzt selbst zufällig in die game Liste Zahlen von 0 bis 3. Nun steht in dieser Liste in Runde 2: 0 und 2.
Nun muss der Spieler auf Farben klicken die diese Werte haben. Drückt der Spieler auf Grün (was 0 entspricht), wird 0 in die player Liste hinzugefügt.
Das Problem: Die Listen werden mit einander verglichen und weichen natürlich ab: in game stehen ja zwei Werte drin und in player nur ein Wert, deswegen setzt er Spielende auf true.
Dieses Problem versuchte ich mit dem Zusatz

&& game.size() == player.size()

zu beseitigen:

Java:
if(game.equals (player) && player.size() == game.size()) //Wenn game und player Liste übereinstimmen ...
                {
                    Spielende = false; //... bleibt das Spielende false ...
                    sequenz = runden + 1; /** Wird sequenz um 1 erhöht
                     * sorgt dafür das die anfangsschleife nicht
                     * unterbrochen und fortgeführt wird
                     */
                    beg = 0;
                }
                else {Spielende = true; //.. wenn nicht, tritt das Spielende ein
                }

also die Listen player und gamer weichen nur bis zu einem bestimmten Zeitpunkt von ihren Inhaltsanzahl ab. Allerdings funktioniert mein Lösungansatz nicht, weil er trotzdem dann das Spielende auf true setzt.
Ich hoff ich konnt die Situation un das Problem gut erklären 😉
 
Wenn du's über equals() (@override?) oder KlassenMethoden nicht schaffst, dann mach dir ne methode:
prüfeGleichheit(liste1,liste2)

Dann kannst du jedes Element überprüfen wie du willst,
Ist die Reihenfolge wichtig?
Willst du Zahlen oder Texte oder Farben vergleichen?
Groß/klein

Aber solange die Anzahl nicht übereinstimmt KÖNNEN die Listen ja nie gleich sein.
und bei gleicher Länge ist der Inhalt noch lange nicht überprüft.
 
Wie gesagt in den beiden Listen stehen ganz einfach nur Zahlen drin. 0, 1, 2 oder drei welche Farben auf dem Spielfeld entprechen.
Klar wenn sie nicht gleich groß sind können sie nicht gleich sein. Das Spiel soll ja weiter gehen bzw aufhören wenn der Spieler die Farbanzahl die in der gamer Liste (bzw es gibt noch eine Variable "runden" die die Runden mitzählt) geklickt hat. deshalb muss ja überprüft werden ob die Listen inhaltlich und(!) größenmäßig übereinstimmen, deswegen

if(game.equals (player) && player.size() == game.size())
 
[WR]Das kann duch nur Bullshit sein!
... deshalb muss ja überprüft werden ob die Listen inhaltlich und(!) größenmäßig übereinstimmen
Wenn sie inhaltlich übereinstimmen kann wohl die Größe keine Thema mehr sein?!?!?!
[/WR]

die Farbanzahl geklickt hat
Was soll das bedeuten?
"Anzahl" ist eine einige Ziffer! ... und ob 3==3 ist wirst du wohl abfragen können?

Zum x. mal:
Irgendwas ist an deiner Beschreibung faul! Oder keiner versteht sie (zumindest ich anscheinend nicht)
Definier mal was für dich GLEICH heißt!
Mach meinetwegen Beispiele,
Beispiele für GLEICH, und Beispiele für UNGLEICH.
Beschreib wie du auf dem Papier vergleichen würdest,
stell mal klar was du meinst!
 
Zuletzt bearbeitet:
Ich hab den Code etwas abgeändert:

Java:
if(player.size() == game.size()){ //prüft ob die Listengrößen übereinstimmen
                    if(game.equals (player)) //Wenn game und player Liste übereinstimmen ...
                    {
                        Spielende = false; //... bleibt das Spielende false ...
                        sequenz = runden + 1; /** Wird sequenz um 1 erhöht
                         * sorgt dafür das die anfangsschleife nicht
                         * unterbrochen und fortgeführt wird
                         */
                        beg = 0;
                    }
                    else {Spielende = true; //.. wenn nicht, tritt das Spielende ein
                    }

Es ist doch ganz simpel:
Wenn die Anzahl and Werten in den Listen übereinstimmen (also in game stehen 2 werte drin und in player stehen 2 Werte drin), heißt das ja nicht das sie auch inhaltlich übereinstimmen. Wenn ich nur auf den Inhaltprüfe schmeisst er mich gleich aus der Schleife raus weil z. B. player(0) ungleich game(0, 2) ist. Habs probiert, nur das zu programmieren klappt net. Obwohl beides zusammen auch irgendwie net klappt. Soll ich mal den ganzen Code posten, vielleicht hilft das ja mich zu verstehen.

Definition von Gleich: Die Listen müssen an Anzahl der Werte die in ihnen stehen UND an den Werten selbst identisch sein. Stimmt die Anzahl, aber die Werte nicht (z. B: game(0, 2) und player(0, 1)) ist das Spiel verloren (weil ich ja was falsches geklickt hab).
Stimmen die Listen nicht mit der Anzahl überein, also sind in game mehr Werte drin als in player (was IMMER am Anfang der Fall ist) soll er halt warten bis die Anzahl übereinstimmt und dann mal gucken ob auch das selbe drin steht (ideal fall: game(0, 2) - player(0, 2) -> so ist die Runde gewonnen und in der nächsten werden 3 Farben abgefragt).
 
Nun leider klappt der Code nur nach meiner Logik aber nicht in der Praxis.
In Runde 1 funktioniert alles wunderbar:
Eine Farbe leuchtet auf, ich klick darauf, Runde Zwei Startet. Zwei Farben leuchten auf, ich klick auf die erste farbe und das Spiel setzt Spielende auf true und das Spiel ist aus bevor ich überhaupt die zweite Farbe klicken konnten. Hier besteht das Problem
 
Lass dir vor dem Vergleich die Arrays ausgeben, damit du sicher bist was drin steht.

Array-Vergleich geht über die Array-Klasse:
Java:
    boolean equal = Arrays.equals(array1,array2);
    System.out.println("Arrays sind gleich ? " + equal);
 
es ist schon spät leute, so arg streng ich meinen kopf auch nich mehr an ;-)

muss ich da jetzt statt array ernsthaft ne neue variable anlegen?? aber dann kann ich sie doch garnich vergleichen wenn beide in einer stehen 😵

boolean equal = "Irgendwas - was weiss ich".equals(player, game);
System.out.println("Arrays sind gleich ? " + equal);
 
das Arrays. kannst du mitkopieren 🙂 .. das ist eine Klasse und stellt paar statische Methoden bereit. Diese Klasse musst du gegebenfalls importieren (java.util.Arrays)
 
hab ArrayList mit Arrays verwechselt 😉

meckern tut er immernoch wegen equals. Scheint er nicht zu kennen:

boolean equal = Arrays.equals(player, game);
System.out.println("Arrays sind gleich ? " + equal);
 
Wie umfangreich ist deine Klasse wo du das verwenden magst? Poste die mal hier rein, wenns nicht die Anzeige sprengt 😀
[EDIT]ein "scheint er nicht zu kennen" gilt nicht, denn die Methode gibts .. ich vermute die Parameter passen nur zu keiner bekannten Variante?![/EDIT]
 
Die Listen sind Integer.

Hier der gesamte Code der Klasse:

Java:
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;  // Verarbeitung von Listen
import java.util.ArrayList;
import java.lang.Math;
import java.util.Arrays;

/**
 * Write a description of class Starter here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */

public class Starter  extends Actor

{
    RedIn ri;
    BlueIn bi;
    YellowIn yi;
    GreenIn gi;

    MouseInfo m;

    int playerSize;
    int gamerSize;
    int runden = 0;
    int ende;
    int beg = 0;
    int sequenz = 1;
    int z = 60; //Zeitraum in der die Farbe sichtbar ist
    List<Integer> game = new ArrayList<Integer>();    // Game erstelle Liste
    List<Integer> player = new ArrayList<Integer>();    // Spieler Liste (zum vergleich)
    int c; //Farbvariable für die Listen
    boolean Spielende = false;

    /** Konstruktor
     * 
     */
    public Starter(RedIn r, BlueIn b, YellowIn y, GreenIn g) {
        ri = r;
        bi = b;
        yi = y;
        gi = g;
    }

    /**
     * Act - do whatever the Starter wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        Spiel(); //das eigentliche Spiel

    }    

    public void Spiel()
    {
        //         while(Spielende == false) //Solange das Spielende nicht eingetroffen ist, wird gespielt
        //         { 
        //         }
        ende = 0;
        game.clear();
        player.clear();

        if (beg < sequenz) //Beginn() wird so oft wie die Sequenz ausgeführt ausgeführt
        {
            Beginn();
        }

        m = Greenfoot.getMouseInfo();
        if (m != null){

            //if(Greenfoot.mouseClicked("RedIn.class")) { //Prüft ob auf RedIn geklickt wurde
            if(Greenfoot.mouseClicked(ri)) { //Prüft ob auf RedIn geklickt wurde
                //if(Greenfoot.mouseClicked(null)) { //Prüft ob auf RedIn geklickt wurde
                //if(m.getActor() == ri) { //Prüft ob auf RedIn geklickt wurde
                //if(m.getX() < 250) { //Prüft ob auf RedIn geklickt wurde
                player.add(1); //in die Player Liste wird "1" für Rot gesetzt
                setRed();
                if(player.size() == game.size()){ //prüft ob die Listengrößen übereinstimmen
                    boolean equal = Arrays.equals(game);
                    System.out.println("Arrays sind gleich ? " + equal);
                    if(game.equals (player)) //Wenn game und player Liste übereinstimmen ...
                    {
                        Spielende = false; //... bleibt das Spielende false ...
                        sequenz = runden + 1; /** Wird sequenz um 1 erhöht
                         * sorgt dafür das die anfangsschleife nicht
                         * unterbrochen und fortgeführt wird
                         */
                        beg = 0;
                    }
                    else {Spielende = true; //.. wenn nicht, tritt das Spielende ein
                    }
                }
            }

            if(Greenfoot.mouseClicked(bi)) {
                player.add(2);
                setBlue();

                if(player.size() == game.size()){
                    if(game.equals (player) && player.size() == runden)
                    {
                        Spielende = false;
                        sequenz = runden + 1;
                        beg = 0;
                    }
                    else {Spielende = true;}
                }
            }

            if(Greenfoot.mouseClicked(yi)) {
                player.add(3);
                setYellow();

                if(player.size() == game.size()){
                    if(game.equals (player) && player.size() == runden)
                    {
                        Spielende = false;
                        sequenz = runden + 1;
                        beg = 0;
                    }
                    else { Spielende = true;}
                }
            }

            if(Greenfoot.mouseClicked(gi)) {
                player.add(0);
                setGreen();

                if(player.size() == game.size()){
                    if(game.equals (player) && player.size() == runden)
                    {
                        Spielende = false;
                        sequenz = runden + 1;
                        beg = 0;
                    }
                    else {Spielende = true;}
                }
            }
        }

        if (Spielende == true)
        {
            ende = 1;
            setRed();
            setBlue();
            setYellow();
            setGreen();
        }
    }

    public void Beginn() //Wählt zufällig eine Farbe
    {
        int farbe;

        farbe = Greenfoot.getRandomNumber (4); //qqq
        //farbe = 1;

        if ( farbe == 1 )
        {
            c = 1;
            runden = runden + 1;
            setRed();
        }

        if ( farbe == 2 )
        {
            c = 2;
            runden = runden + 1;
            setBlue();
        }

        if ( farbe == 3 )
        {
            c = 3;
            runden = runden + 1;
            setYellow();
        }

        if ( farbe == 0 )
        {
            c = 0;
            runden = runden + 1;
            setGreen();
        } 

    }

    public void setRed()
    {  
        Red r = new Red();
        int xPos = 137;
        int yPos = 131;

        this.getWorld().addObject(r, xPos, yPos);
        if(ende == 0) {
            Greenfoot.delay(z); //farbe bleibt für den zeitraum z auf dem Feld
            this.getWorld().removeObject(r);
            Greenfoot.delay(5); //kleine pause vor der neuen farbwahl
            beg = beg + 1;
            game.add(c);
        }
    }

    public void setBlue()
    {   
        Blue b = new Blue();

        int xPos = 363;
        int yPos = 131;

        this.getWorld().addObject(b, xPos, yPos);
        if(ende == 0) {
            Greenfoot.delay(z);
            this.getWorld().removeObject(b);
            //Greenfoot.playSound("Blau.mp3");
            Greenfoot.delay(5);
            beg = beg + 1;
            game.add(c);
        }
    }

    public void setYellow()
    {   
        Yellow  y = new Yellow();
        int xPos = 138;
        int yPos = 366;

        this.getWorld().addObject(y, xPos, yPos);
        //Greenfoot.playSound("Gelb.mp3");
        if (ende == 0) {
            Greenfoot.delay(z);
            this.getWorld().removeObject(y);
            Greenfoot.delay(5);
            beg = beg + 1;
            game.add(c);
        }
    }

    public void setGreen()
    {   
        Green g = new Green();
        int xPos = 362;
        int yPos = 368;

        this.getWorld().addObject(g, xPos, yPos);
        //Greenfoot.playSound("Gruen.mp3");
        if (ende == 0) {
            Greenfoot.delay(z);
            this.getWorld().removeObject(g);
            Greenfoot.delay(5);
            beg = beg +1;
            game.add(c);
        }
    }
}
 
ja gut das kann ja nich gehen (AquaBall is Schuld 😀) .. sind ja auch Listen und keine Arrays, dann is ein Vergleich mit der Methode ja gar net machbar .. ich schau ma übern Code
 
Hm also mich wundert gerade warum das überhaupt was beendet ^^

In
Code:
Beginn()
legst du eine Farbe in der Liste
Code:
game
ab (durch setX-Methode). Egal welche Runde gerade gespielt wird.

Sei es nun Runde eins, dann versteh ich das sogar noch. Der Spieler klickt dann irgendwo drauf und das was er geklickt hat wird in der Liste
Code:
player
abgelegt. Danach rufst du ebenfalls
Code:
setX
der für die jeweilige Farbe auf. Da das Spiel nicht beendet ist zu diesem Zeitpunkt wird doch erneut was in
Code:
game
abgelegt oder sehe ich das falsch?! Das bedeutet in meinen Augen, dass vor der Prüfung der 2 Listen
Code:
game
IMMER um 1 länger ist als
Code:
player
und damit eigentlich nie ein korrektes Ende herbeigeführt werden kann. ???:L
 
beg ist doch am Anfang "0" und wird um 1 erhöht wenn eine Farbe in game geschrieben wird. Dies wird ja solange gemacht bis beg nicht mehr kleiner sequenz ist. Und sequenz wird ja nur erhöht wenn ich die richtige Farbe drücke, so beginnt ja eine neue Runde. Allerdings wird in Runde 2 das Spiel beendet obwohl ich nur eine Farbe geklickt habe. Normalerweise müsste er doch sehen das die Listen nicht gleich lang sind und garnicht erst in die "if(game.equals (player))" Bedinging reinrutschen. Nur dann kann er ja Spielende true setzen ...
 
was ich nicht verstehe ist folgender Ablauf (komplett neues Spiel, erste Runde):

Java:
ende = 0;
game.clear();
player.clear();
 
//beg = 0 .. sequenz = 1
if (beg < sequenz)
    Beginn();

// in Beginn() sagen wir Rot wurde gewürfelt
if ( farbe == 1 ) {
    c = 1;
    runden = runden + 1;
    setRed();
}

// in setRed()
if(ende == 0) {
    // [..]
    beg = beg + 1;
    game.add(c);
}

//game hat nun einen Eintrag für Rot drinne, setRed() und Beginn() werden verlassen, weiter in Spiel()
if(Greenfoot.mouseClicked(ri)) { //Prüft ob auf RedIn geklickt wurde
    player.add(1); //in die Player Liste wird "1" für Rot gesetzt
    setRed(); // game wird doch hier wieder erweitert?!
    
    if(player.size() == game.size()) {
        if(game.equals (player)) {
            Spielende = false;
            sequenz = runden + 1;
                // sorgt dafür das die anfangsschleife nicht unterbrochen wird
                // ----- WELCHE SCHLEIFE EIGENTLICH -----
                // ----- Aber stimmt eine in Spiel würde Sinn machen -----
                beg = 0;
        } else {
            Spielende = true;
        }
    }
}

// in der Zeile 25 gehst du wieder in setRed rein
// ende ist weiterhin 0 und somit legst du doch wieder etwas rotes in game ab oder nicht (siehe Zeile 15)
// damit wäre game = [1,1] und player nur [1] und das in der allerersten Runde?!
Kannst dazu mal was sagen?
 
Zuletzt bearbeitet:
Momentmal!
ICH hab hier gar nichts verwechselt!
ICH hab behauptet:
Code:
Array-Vergleich geht über die Array-Klasse.
Und DAS kann wohl niemand verneinen! Oder?:bahnhof:
Naja lassen wir das Thema!

Aber,
langsam bekomm ich eine Abneigung gegen diese GreenFoot.
Was die für einen Code erzeugen?!? Ist ja fahrlässig.
Ist ja nett um schnell mal ein Spielchen zu programmieren,
Aber damit Java zu unterrichten grenzt an Körperverletzung?

@TO: lies vielleicht mal: http://www.java-forum.org/java-basics-anfaenger-themen/136602-problem-listen-add.html#post901329
 
Hab mir den Code nochmal angeschaut.
Also in sofern geb ich dir recht das dass setRed() dort ein kleinen Fehler hat. Denn in setRed() wird die Variable beg ja um eins erweitert. Es soll erscheinen damit der Spielner ne Resonanz hat. Hab dies so korrigiert:

Java:
if(Greenfoot.mouseClicked(ri)) { //Prüft ob auf RedIn geklickt wurde
               player.add(1); //in die Player Liste wird "1" für Rot gesetzt
                setRed();
                beg = beg - 1; //das zuvor addierte wird wieder abgezogen, da falsch
                if(player.size() == game.size()){ //prüft ob die Listengrößen übereinstimmen
                    if(game.equals (player)) //Wenn game und player Liste übereinstimmen ...
                    {
                        Spielende = false; //... bleibt das Spielende false ...
                        sequenz = runden + 1; /** Wird sequenz um 1 erhöht
                         * sorgt dafür das die anfangsschleife nicht
                         * unterbrochen und fortgeführt wird
                         */
                        beg = 0;
                    }
                    else {Spielende = true; //.. wenn nicht, tritt das Spielende ein
                    }
                }
            }

Zu deiner Frage mit der Schleife: Es geht um die Schleife, in der Beginn() steht. Denn wenn alles richtig geklickt wurde soll ja die Sequenz um 1 größer werden (Runde 1 eine Farbe, Runde 2 zwei Farben usw. ...).
nach meiner Änderung bricht er aber immernoch nach nur einer Farbe ab: zwei Farben werden angezeigt, ich klick eine und aus irgendeinem mysteriösen grund kann er Spielende true setzen un alles ist vorbei! BLÖD! xD
 
ich glaub es liegt auch an der Position der clear Methoden. Hab aber schwierigkeiten für die ne andere bessere Position zu finden.
 

Zurück
Oben