Zwei ArrayList(s) vergleichen

Hallo,
habe folgendes Problem, ich möchte zwei ArrayList(s) vergleichen, sprich prüfen ob EINE übereinstimmung in den beiden vorhanden ist. Wenn ich es so mache funktioniert es:

if(myArrayList1.contains("Flugzeug"){}
if(myArrayList2.contains("Flugzeug"){}

Aber das mit dem “Flugzeug” weis ich nicht, also ich möchte beide Listen direkt miteinander vergleichen und sehen ob ein Eintrag in beiden gleich ist. Weis zufällig jemand wie man das macht?

Einfach jeden Eintrag von “myArrayList1” mit jedem Eintrag von “myArrayList2” vergleichen (zwei verschachtelten Schleifen).

Hatten wir das nicht letzt schonmal? :wink:

            myArrayList1.add("Deutschland");
            myArrayList1.add("Frankreich");
            myArrayList1.add("England");
    
            ArrayList<String> myArrayList2 = new ArrayList<String>();
            myArrayList2.add("Frankreich");
            myArrayList2.add("Italien");
            myArrayList2.add("Spanien");
    
            for (int x = 0; x < myArrayList1.size(); x++ )
            {
                for (int y = 0; y < myArrayList2.size(); y++)
                {
                    if (myArrayList1.get(x).equalsIgnoreCase(myArrayList2.get(y)))
                    {
                        System.out.println("In beiden Listen gibt es das Land: " + myArrayList1.get(x));
                    }
                }
            }```

greetz

Vielen Dank, so sieht das ganze schon deutlich besser aus. Allerdings will der Compiler das “equalsIgnoreCase” nicht:
cannot find symbol method equalsIgnoreCase(java.lang.Object)

Ich habe ein ähnliches Problem. Ich möchte von ausgewählte Elemente von einer ArrayList A in eine List B kopieren. Wenn List B eins der ausgewählten Elemente schon hat sollen diese schon vorhandenen Elemente nicht in List B kopiert werden, die nicht vorhandenen schon.

Meine nicht funktionierende Lösung ist eine dritte Liste C zu erstellen, die die ausgewählten Elemente beinhaltet. Danach vergleiche ich ob B Elemente von C enthält wenn ja, lösche ich die Elemente aus C. Wenn beide Schleifen durchlaufen wurden, adde ich alle Elemente aus Liste C in die Liste B. Problem: In Liste B werden Elemente reinkopiert obwohl die schon vorhanden sind, d.h. ich habe mehrere gleiche Elemente in Liste B…

		{
		    for (int y = 0; y < this.werteListe.getList().getItemCount() && this.ausgewaehlteElemente.size() > x; y++)
		    {
			System.out.println("i + j: " + y + " " + x); 
			if ((this.werteListe.getList().getItem(y).contains(this.ausgewaehlteElemente.get(x).getBenennung())))
			{
			    this.ausgewaehlteElemente.remove(x);
			}
		    }
		}
		
		
		    System.out.println(this.ausgewaehlteElemente.size());
		    for (int i = 0; i < this.ausgewaehlteElemente.size() && this.ausgewaehlteElemente.get(i) != null; i++)
		    {
			this.werteListe.add(this.ausgewaehlteElemente.get(i));
		    }```

Das hört sich so an, als ob ein [japi]Set[/japi] genau das ist, was du brauchst. Das Set ist eine Collection, die keine doppelten Elemente enthalten darf.
Wenn du dann A.addAll(B) machst, dann werden A alle Elemente aus B hinzugefügt, die in A noch nicht enthalten sind.

Mist, die Liste B ist keine java.util.List sondern eine swt.widgets.List… :confused:

was gibt es zu so ausführlichen Code noch groß zu sagen?
schaffe dir eine reproduzierbare Lage, prüfe also immer dasselbe Beispiel,

suche dir genau ein Problem heraus,
“Problem: In Liste B werden Elemente reinkopiert obwohl die schon vorhanden sind, d.h. ich habe mehrere gleiche Elemente in Liste B…”
heißt also, dass ein konkretes Element Xy übernommen wird obwohl in der Zielliste B schon drin,

jetzt beobachte Xy, was genau passiert in
if ((this.werteListe.getList().getItem(y).contains(this.ausgewaehlteElemente.get(x).getBenennung())))
für dieses Element, logge allgemein oder speziell wenn Xy drankommt das boolean-Ergebnis von contains, gegebenfalls die Parameter usw.,
gehe dem Problem auf den Grund!

was liefert getItem(y) für einen Datentyp zurück,
was enthält dieses Objekt, falls wieder eine Liste,
wirklich Strings so dass contains() funktionieren kann?


oder meinst du vielleicht, dass Xy in B nicht drin sondern 2x in C und dann 2x übernommen wird obwohl es nur einmal rein soll?
da du B=ausgewaehlteElemente unter Kontrolle hast, könntest du das für sich zu einem Set machen, dann Doppelte weg

[QUOTE=SlaterB]was gibt es zu so ausführlichen Code noch groß zu sagen?
schaffe dir eine reproduzierbare Lage, prüfe also immer dasselbe Beispiel,

suche dir genau ein Problem heraus,
“Problem: In Liste B werden Elemente reinkopiert obwohl die schon vorhanden sind, d.h. ich habe mehrere gleiche Elemente in Liste B…”
heißt also, dass ein konkretes Element Xy übernommen wird obwohl in der Zielliste B schon drin,

jetzt beobachte Xy, was genau passiert in
if ((this.werteListe.getList().getItem(y).contains(this.ausgewaehlteElemente.get(x).getBenennung())))
für dieses Element, logge allgemein oder speziell wenn Xy drankommt das boolean-Ergebnis von contains, gegebenfalls die Parameter usw.,
gehe dem Problem auf den Grund!

was liefert getItem(y) für einen Datentyp zurück,
was enthält dieses Objekt, falls wieder eine Liste,
wirklich Strings so dass contains() funktionieren kann?


oder meinst du vielleicht, dass Xy in B nicht drin sondern 2x in C und dann 2x übernommen wird obwohl es nur einmal rein soll?
da du B=ausgewaehlteElemente unter Kontrolle hast, könntest du das für sich zu einem Set machen, dann Doppelte weg[/QUOTE]

Erstmal vielen Dank an euch.

Die Überprüfung
if ((this.werteListe.getList().getItem(y).contains(this.ausgewaehlteElemente.get(x).getBenennung())))
prüft ob zwei Strings gleich sind bzw. ob werteListe ein Element aus ausgewaehlteElemente beinhaltet. Das funktioniert alles soweit.

Das Problem liegt in der zweiten for-Schleife bzw. beim remove.

&& this.ausgewaehlteElemente.size() > x
this.ausgewaehlteElemente.remove(x);

Wenn ein ausgewähltes Element in der werteListe auftaucht, wird es aus der ausgewaehlteElemente-Liste gelöscht und die dahinterliegenden Element aus der ausgewaehlteElemente-Liste rücken auf. Die for-Schleife wird beendet, obwohl es noch ein Element nachprüfen müsste. Das Problem habe ich jetzt festgestellt.
Jetzt muss ich mal überlegen wie ich das korrigieren muss…

ach so ja, an sich bekannt, nicht recht darauf geachtet weil man normalerweise deshalb eine extra Liste nimmt,
aber die hast du ja aus etwas anderem Grund,
hier könntest du nun eine weitere Liste X einführen…, nichts in ausgewaehlteElemente löschen, sondern die zu löschenden Elemente sammeln in X, danach löschen,
bzw. von der nachfolgenden Schleife nur übernehmen, was nicht in X ist

[QUOTE=Kokscola]Wenn ein ausgewähltes Element in der werteListe auftaucht, wird es aus der ausgewaehlteElemente-Liste gelöscht und die dahinterliegenden Element aus der ausgewaehlteElemente-Liste rücken auf. Die for-Schleife wird beendet, obwohl es noch ein Element nachprüfen müsste. Das Problem habe ich jetzt festgestellt.
Jetzt muss ich mal überlegen wie ich das korrigieren muss…[/QUOTE]

Das kann man ganz leicht korrigieren. Du darfst nicht mit einer Zählschleife über die Liste iterieren, sondern musst einen Iterator verwenden. Auf dem Iterator kannst du die remove-Methode verwenden, dann wird das aktuelle Element aus der Liste gelöscht und trotzdem werden alle Elemente geprüft.
Schematisch sieht das dann in etwa so aus (das Beispiel deckt deinen Spezialfall ab, beachte, dass beide 3en gelöscht werden):

for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext(); ) {
    Integer i = iterator.next();
    if (i.equals(3))
        iterator.remove();
}
for (Integer i : list)
    System.out.println(i);```

Danke cmrudolph! Jetzt funktioniert es.