5

Ich möchte eine verkettete Liste verwenden, um Extraktionen und Einfügungen von Elementen durchzuführen und alle Kombinationen für eine Heuristik auszuprobieren. Verknüpfte Listen sind für diese Art von Operationen effizienter. Da ich alle möglichen Paare von Extraktionen/Inserts ausprobieren möchte, habe ich zwei verschiedene Iteratoren über die Liste verwendet. Dies löst eine "ConcurrentModificationException" aus. Wie könnte ich diese Operation effizient durchführen, ohne die Liste jedes Mal neu zu durchlaufen, da dies den gesamten Zweck der Verwendung einer Liste an erster Stelle zunichte machen würde?Wie verwendet man zwei verschiedene Iteratoren auf einer Linked List in Java?

Hier ist der relevante Teil des Codes:

ListIterator<Integer> it1 = data.listIterator(); 
ListIterator<Integer> it2; 

while(it1.hasNext()) { 
    int i = it1.next(); 
    it2 = data.listIterator(); 

    while(it2.hasNext()) { 
     if (i == it2.next()) continue; // continue right away when the indexes are equal 
     it1.remove(); 
     it2.add(i); 
     if (length() < best) 
      return true; 
     } 

    // when the swap is not better/consistent 
    it2.remove(); 
    it1.add(i); 
} 
return false; 

Dank

+2

Wenn Sie die Liste durch einen Iterator ändern, können Sie keine anderen Iteratoren verwenden. –

+1

Können Sie stattdessen ConcurrentLinkedQueue verwenden, da CME nicht abgerufen wird? Ich vermute, dass es in jedem Fall einen effizienteren Weg gibt, zu tun, was immer du tust. –

+0

Bitte Google so: www.google.com/search?q=multi+dimensional+linked+list+java und überprüfen Sie die Ergebnisse wie http://www.dreamincode.net/forums/topic/282327-multi-dimensional-linked -list/ –

Antwort

0

Sie können eine beliebige Anzahl von Iteratoren auf einer Liste verwenden, wenn Sie nur einen Lesevorgang tun. Da Sie hier eine remove/add-Anweisung ausführen, können Sie dieselbe Liste nicht mit zwei verschiedenen Iteratoren verwenden, da dies die ConcurrentModificationException, wie Sie sie gerade erleben, verursacht.

Was möchten Sie erreichen? Möglicherweise können Leute Ihnen mit verschiedenen Wahlen helfen.

+1

Sie sollten keine Kommentare als Antwort schreiben. –

+0

Einverstanden. Aber erlaubt mir nicht, als Kommentar wegen der Starter-Status in Stackoverflow hinzufügen :(. – muruga

+0

Vor zwei Stunden, das ist nicht mehr wahr :) Der Schwellenwert ist 50. –

1

Sie können nicht mehrere Iteratoren gleichzeitig auf einem LinkedList verwenden, jedoch können Sie mit einem CopyOnWriteArrayList

Versuchen Sie folgendes:

List<Integer> safeData = new CopyOnWriteArrayList(date); 
// your code, but working with safeData rather than data 
+0

Vielen Dank, aber dies ist als implementiert Array, nicht als Liste. Dies bedeutet, dass Einsätze nicht effizient sind. O (n) anstelle von O (1). –

+1

@DavidBlinder Inserts werden weniger effizient sein, aber nicht wegen irgendetwas, was Sie gesagt haben. lists * use * arrays intern, aber diese spezielle Klasse macht eine ganze Kopie von itersel intern auf Änderung, um es threadsafe zu machen - siehe linked javadoc – Bohemian

1

Wenn ich Sie richtig, Sie für eine Datenstruktur suchen, die Angebote mehrere Iteratoren zum Manipulieren der Liste. Dies ist für das ursprüngliche java.util.LinkedList technisch schwierig, da es den aktuellen Index verwaltet und dies nur auf effiziente Weise möglich ist, wenn keine parallelen Änderungen an unbekannten Positionen in der Liste durch andere Iteratoren vorgenommen werden. Sie können jedoch einfach eine einfache LinkedList implementieren, die diese Verwaltung nicht unterstützt und das Hinzufügen/Entfernen über mehrere Iteratoren unterstützt. Dann weiß ein Iterator seine Position in der Liste nicht, aber ich wette, es ist Ihnen egal. Verwenden Sie einfach Folgendes:

Verwandte Themen