Methoden Anfängerfrage: 2 Listen Vergleichen

Alex_Groß

Mitglied
Hallo,

ich lerne gerade java un muss 2 Listen Vergleichen. z. B
List 1[1, 2, 3, 4, 5] und
List 2 [2, 3, 4, 5, 6]
Die Werte, die in der ersten Liste vorhanden und in der zweiten nicht, müssen in eine liste kommen
Die Werte, die in der Zweiten vorhanden und in der ersten nicht in eine andere.
Ich habe versucht das so zu lösen:
Code:
		for (Integer int1 : list1) {
			for (Integer int2 : list2) {
				if (int1.equals(int2)) {
					list2.remove(int2);
					break;
				}
			}
		}
so bekomme ich die werte, die nur in der zweiten liste vorhanden. Um die Werte zu bekommen, die nur in der ersten Liste stehen muss ich das gleiche, nur umgekehrt machen.
Ich denke es gibt eine intelligentere Lösung. Für eure Vorschläge wäre ich sehr dankbar
Alx
 
Java:
List<Integer> result = new ArrayList<Integer>(list1);
result.removeAll(list2);
So hättest du in result alle Elemente die in list1 aber nicht in list2 vorhanden sind.

Das selbe kannst du dann nochmal umdrehn und hast die andere Richtung.
 
während der Iteration darfst du nichts entfernen, das hagelt Fehlermeldungen

sammle die Elemente lieber in einer dritten Liste,
bzw. performanter: nimm ein Set, erste Liste einfügen, zweite löschen (edit: retainen), das ist linear schnell statt quadratisch langsam

danach kannst du dann Differenzen zwischen der Schnittmenge und den beiden Einzellisten bestimmen, falls nötig
 
bzw. performanter: nimm ein Set, erste Liste einfügen, zweite löschen (edit: retainen), das ist linear schnell statt quadratisch langsam
Das stimmt, dabei geht aber evtl. die Reihenfolge der Elemente verloren. Wenn's egal ist gut, ansonsten schön bei Listen bleiben.
 
Hm, da ich gerade auch eine solche Liste brauchte hier meine Lösung (mit deinem Beispiel)....

Java:
    public static void main(String[] args) {
        List list1 = Arrays.asList(1, 2, 3, 4, 5);
        List list2 = Arrays.asList(2, 3, 4, 5, 6);
        System.out.println(subtract(list2, list1));
    }
    
    public static List subtract(final List list1, final List list2) {
        final ArrayList result = new ArrayList(list1);
        final Iterator iterator = list2.iterator();
        while (iterator.hasNext()) {
            result.remove(iterator.next());
        }
        return result;
    }


Und nun ein wenig Offtopic...
Wenn solche Anweisungen in der Praxis den Falschenhals darstellen der ein Programm verlangsamt macht gebe ich einen aus. Allen. 🙂
 
result .removeAll(list2) würde auch gehen, aber dann mit besagtem negativem Effekt für die Laufzeit (nimm' mal Listen mit 1000000 Elementen...)
 

Zurück
Oben