Listen vereinen, wenn Elemente am Anfang/Ende übereinstimmen

equin

Aktives Mitglied
Hallo,

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...
 

Zurück
Oben