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.
Listen vereinen, wenn Elemente am Anfang/Ende übereinstimmen
folgendes will ich erreichen: Ich habe eine Liste, die weitere Listen bestehend aus "Points" beinhaltet. Nun will ich diese Listen zusammenfassen, wenn sich das erste und das letzte Element von 2 Listen überschneiden (oder umgekehrt). Eigentlich hört sich das ja nicht so schwierig an. aber trotzdem mach ich damit jetzt schon den ganzen Tag rum und bekomme es einfach nicht hin.
Mein jetziges Programm wirft eine "java.util.ConcurrentModificationException". Falls jemand ein Verbesserungsschlag hätte wäre ich sehr Dankbar Hier das Programm:
Java:
List<List<Point>> list = new ArrayList<List<Point>>();
List<Point> list1 = new ArrayList<Point>();
List<Point> list2 = new ArrayList<Point>();
list.add(list1);
list.add(list2);
list1.add(new Point(1,3));
list1.add(new Point(4,3));
list2.add(new Point(3,3));
list2.add(new Point(6,3));
list2.add(new Point(1,3));
Iterator<List<Point>> iter = list.iterator();
while(iter.hasNext()){
// Für jede Liste erstes und letztes Element heraussuchen
List<Point> list_inner = iter.next();
Point first = list_inner.get(0);
Point last = list_inner.get(list_inner.size()-1);
// ... und mit dem ersten und letzten Element jeder anderen Liste vergleichen
Iterator<List<Point>> iter2 = list.iterator();
while(iter2.hasNext()){
List<Point> list_inner2 = iter2.next();
Point first_comp = list_inner2.get(0);
Point last_comp = list_inner2.get(list_inner2.size()-1);
if(!list_inner.equals(list_inner2) && (first.equals(first_comp) || last.equals(last_comp) || first.equals(last_comp) || last.equals(first_comp))){
// wenn Bedinungen erfüllt sind, werden die Listen vereinigt, und die nun überflüssige Liste gelöscht
list_inner.addAll(list_inner2);
list.remove(list_inner2);
}
}
}
Du darfst den Inhalt einer Liste (in dem Fall 'list') wärend du sie "iteratierst" nicht verändern. Also nutze besser eine eigene countervariable und eine 'normale' for. Und achte darauf, dass ein remove den Index sämtlicher darauf folgenden Elemente verändert.
Statt Iteratoren oder (imho fast noch schlimmer) undurchsichtigem Indexgewurschtel ist es oft deutlich einfacher, übersichtlicher und intuitiver, in solchen Fällen eine neue Liste zu erstellen. Wenn das nicht irgendwie Performancekritisch ist, macht man sich (und jedem, der den Code irgendwann nochmal nachvollziehen muss (was einen selbst i.a. mit einschließt )) das Leben deutlich leichter.
EDIT: Wobei, so beim zweiten drüberlesen: Es geht ja um die Liste der Listen (und nicht um Elemente der einzelnen Listen), da kann man das auch mit dem Index machen, das macht dann wohl nicht sooo viel unterschied...