Iterator kopieren

Status
Nicht offen für weitere Antworten.
Q

Quurks

Gast
Ich habe eine LinkedList mit max 200 Objekten.
Nun will ich oft alle Elemente mit den anderen Elementen vergleichen.
Das wäre ja relativ einfach möglich, wenn man zwei Iteratoren machen würde und die dann ineinander verschachteln würde:
Code:
Iterator it1=list.iterator();
Iterator it2=list.iterator();
while(it1.hasNext()){
    while(it2.hasnext()){
         //Mach wa smit
        it1.next();
        it2.next();
        }
    }

Aber dort würde ich unnötige Vergleiche anstellen, da ich dann zuerst Element 1 mit 2 vergleichen würde, und dann Element 2 mit 1

Ich hab es bis jetzt mit arrays gelöst, in der Form:
Code:
for (int i =0; j < arr.length; j++) {
    for (int j = i + 1; j < arr.length; j++) {
        //mach was
        }
    }
Aber aus Arrays kann man keine Elemente löschen.
Bei Vectoren gibt es das Problem, dass meine häufigen Löschvorgänge den Vector langsam machen, außerdem hat der Vector bei mir irgendwelche Probleme mit mehr als 150 Elementen, er wird einfach langsam.

DEshalb hab ich mich für die LinkedList entschieden, als Lösung vür mein Problem, dachte ich dass ich evtl den Iterator kopieren könnte:
Code:
Iterator it1=list.iterator();

while(it1.hasNext()){
    Iterator it2=clone(it1);//in der Richtung
    while(it2.hasnext()){
         //Mach wa smit
        it1.next();
        it2.next();
        }
    }
damit ich die ersten Elemente nicht nochmal durchgehen muss.
Aber eclipse meint:
Die Methode clone() im Typ Object ist für die Argumente nicht anwendbar (Iterator)

Ich hoffe auf eure Vorshläge :)
Ich steig auch gern auf einen anderen Typ um, wenn dort die Probleme nicht auftreten[/code]
 
Q

Quurks

Gast
Gut, Danke, aber clonen lassen sich Iteratoren nicht (laut eclipse):
Die Methode clone() ist für den Typ Iterator nicht definiert (undefined)

Den anderen Thread habe ich nicht gefunden, wol die falschen Suchberffe benutzt
 

0x7F800000

Top Contributor
Hmm, bin erst vor kurzem auf fast dasselbe Problem gestoßen, allerdings galt in meiner Situation die einschränkung, dass aus der doppelt verketteten Liste nichts gelöscht wird, sondern nur weitere elemente dazukommen.

http://java-forum.org/de/viewtopic.php?t=82138&postdays=0&postorder=asc&start=15 (bringt nicht wirklich viel das durchzulesen)

Mir ist damals irgendeine andere passable Lösung eingefallen, aber irgendwie war ich mit der auch nicht wirklich zufrieden.

Prinzipiell ist es ein Kinderspiel, dir eine eigene Iterator-Klasse zu basteln, die solche Scherze wie das Löschen von Elementen in verschachtelten Iterator-Schleifen ohne ConcurrentModificationException ermöglicht: du nimmst dir den code aus java.util.LinkedList , aus der privaten Inneren Klasse ListIterator, kopierst den code fast 1:1 in eine neue eigene Iterator-Klasse, und löschst einfach diese Methode:
Code:
	final void checkForComodification() {
	    if (modCount != expectedModCount)
		throw new ConcurrentModificationException();
	}
aus dem ursprünglichen code raus. Dadurch wird das fail-fast verhalten unterbunden. Damit geht natrlich auch eine gewisse sicherheit verloren, da musst du nochmal drei mal genauer nachdenken, wie du es denn so anstellst, dass sich die Iteratoren nicht beißen :roll:

Dann kannst du auch noch einen copy-konstruktor für Iterator hinzufügen (oder Cloneable implementieren, was bei normalen Iteratoren nicht gemacht ist), und fertig ist ein "kopierbarer fail-slow" Iterator, der für deine Anwendung sinnvoller erscheint.

Ich würde aber an deiner Stelle dreimal überlegen, ob du das Problem nicht evtl ganz Umgehen kannst, indem du etwa statt einer Liste ein Set verwendest o.ä.
 
Q

Quurks

Gast
Ob dafür Sets das optimale sind?

Die scheinen mir ja auch mit Iteratoren zu Arbeiten?
 

0x7F800000

Top Contributor
ja, aber das ist dann egal. Du wolltest mit einer 2D-Schleife über die Liste iterieren, objekte vergleichen, und irgendwas löschen. Darauß habe ich geschlossen, dass du womöglich einfach nur die Kopien aus der Liste rauslöschen willst. Aber dann wäre das ganze Unternehmen Sinnfrei, weil du ja dann auch gleich einen TreeSet o.ä. nehmen könntest.
 
B

bananenkasper

Gast
Hi, bin gerade über das gleiche Problem gestoßen und habe mal etwas gebastelt:

Die Methoden sind aus ArrayList kopiert, allerdings ohne den modification check.

Zusätzlich wird das Cloneable - interface implementiert; für die angesprochenen Anwendungszwecke.

Java:
/**
 * 
 * 
 * TODO description
 * 
 * TODO example
 * 
 * @version 2010-09-17
 * 
 * @param <T>
 */
public class ExtendedIteratorImpl<T> implements ListIterator<T>, Cloneable {

	// Fileds //

	/**
	 * 
	 */
	protected final List<T> list;

	protected volatile int numLeft;

	protected volatile int lastPosition = -1;

	/**
	 * 
	 * 
	 * Constructs a new {@code ExtendedIteratorImpl} for given Collection.
	 * 
	 * @param col
	 *            collection over which will be iterated
	 */
	public ExtendedIteratorImpl(Collection<? extends T> collection) {
		if (collection == null)
			throw new NullPointerException();
		synchronized (ExtendedIteratorImpl.class) {
			list = new ArrayList<T>();
			list.addAll(collection);
			numLeft = list.size();
		}
	}

	protected ExtendedIteratorImpl(int numLeft, int lastPosition, List<T> list) {
		this.list = list;
		this.numLeft = numLeft;
		this.lastPosition = lastPosition;
	}

	// Private //

	//

	// Protected //

	//

	// Public //

	//

	// Override //

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof ExtendedIteratorImpl))
			return false;
		ExtendedIteratorImpl<?> other = (ExtendedIteratorImpl<?>) obj;
		if (nextIndex() != other.nextIndex())
			return false;
		if (list == null) {
			if (other.list != null)
				return false;
		} else if (!list.equals(other.list))
			return false;
		return true;
	}
	
	@Override
	protected Object clone() {
		return new ExtendedIteratorImpl<T>(numLeft, lastPosition, list);
	}

	@Override
	public String toString() {
		return nextIndex() + ": " + list;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + nextIndex();
		result = prime * result + ((list == null) ? 0 : list.hashCode());
		return result;
	}

	// Implement //

	/**
	 * 
	 */
	public boolean hasNext() {
		return numLeft > 0;
	}

	/**
	 * 
	 */
	public boolean hasPrevious() {
		return numLeft < list.size();
	}

	/**
	 * 
	 */
	public T next() {
		try {
			int index = list.size() - numLeft;
			T result = (T) list.get(index);
			lastPosition = index;
			numLeft--;
			return result;
		} catch (IndexOutOfBoundsException e) {
			throw new NoSuchElementException();
		}
	}

	/**
	 * 
	 */
	public T previous() {
		int index = list.size() - numLeft - 1;
		T result = list.get(index);
		numLeft++;
		lastPosition = index;
		return result;
	}

	/**
	 * 
	 */
	public synchronized ExtendedIteratorImpl<T> iteratorOverSubList(int startIndex,
			int stopIndex) {
		try{
		return iteratorOverSubList(new ZeroPositiveRange(startIndex, stopIndex));
		}catch(RangeException e){
			throw new IllegalArgumentException(e);
		}
	}

	/**
	 * 
	 */
	public ExtendedIteratorImpl<T> iteratorOverSubList(Range range) {
		return new ExtendedIteratorImpl<T>(list.subList(range.getStart(),
				range.getStop()));
	}

	/**
	 * 
	 */
	public int nextIndex() {
		return list.size() - numLeft;
	}

	/**
	 * 
	 */
	public int previousIndex() {
		return list.size() - numLeft - 1;
	}

	/**
	 * 
	 */
	public void remove() {
		if (lastPosition == -1) {
			throw new IllegalStateException();
		}
		if (lastPosition == list.size() - numLeft) {
			numLeft--; // we're removing after a call to previous()
		}
		list.remove(lastPosition);
		lastPosition = -1;
	}

	/**
	 * 
	 */
	public void set(T object) {

		list.set(lastPosition, object);

	}

	/**
	 * 
	 */
	public void add(T object) {
		list.add(list.size() - numLeft, object);
		lastPosition = -1;
	}

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
D Iterator Allgemeine Java-Themen 1
M Iterator für trinären Baum Allgemeine Java-Themen 0
S OOP ClassCastException bei casting von eigener Klasse aus Iterator Allgemeine Java-Themen 3
D nested loops mit Iterator Allgemeine Java-Themen 2
Pastafari Iterator über nested HashMaps Allgemeine Java-Themen 7
A Compiler-Fehler Woher kommt der NullPointer? (Collections & Iterator) Allgemeine Java-Themen 7
J Mockito Iterator korrekt mocken Allgemeine Java-Themen 5
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
DEvent Wie behandelt man Exceptions in Iterator? Allgemeine Java-Themen 2
M Iterator wirft Exception Allgemeine Java-Themen 10
G ständig Iterator über Kollektion --> falsche Reihenfolge? Allgemeine Java-Themen 2
E Iterator durchlaufen? Allgemeine Java-Themen 8
Redfrettchen addAll verwendet kein Iterator? Allgemeine Java-Themen 8
D generischer Iterator und Set Allgemeine Java-Themen 2
D generischer Iterator mit verschiedenen Typen Allgemeine Java-Themen 3
K Iterator Allgemeine Java-Themen 5
K HashMap durchlaufen mit Iterator Allgemeine Java-Themen 5
C probleme mit iterator Allgemeine Java-Themen 2
M Ordner kopieren Allgemeine Java-Themen 5
S Referenzdatentyp kopieren Allgemeine Java-Themen 5
I Wie Vektor-Grafik in die Zwischenablage kopieren? Allgemeine Java-Themen 2
J Gebautes Jar per Maven in einen Docker Container kopieren Allgemeine Java-Themen 0
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
B In zwischenablage kopieren Allgemeine Java-Themen 2
F Datentypen Kopieren von Datentypen Allgemeine Java-Themen 10
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
N String ins Clipboard kopieren ohne makieren. Allgemeine Java-Themen 12
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
F Java moved Files statt sie zu kopieren Allgemeine Java-Themen 12
X Dateien von der Jar zum Ordner kopieren. Allgemeine Java-Themen 4
J PDF-Datei aus JAR-Archiv in Dateisystem kopieren Allgemeine Java-Themen 1
S Einen übergebenen String kopieren Allgemeine Java-Themen 3
S in Zip kopieren -- Backup-Programm Allgemeine Java-Themen 9
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
J Bilder halb in falscher Farbe nach kopieren aus Web Allgemeine Java-Themen 3
D Mit Hilfe von Java aus Excel-Sheet Zellen in neues Excel Dokument kopieren Allgemeine Java-Themen 3
K NetBeans Ordner bei 'Clean&Build' automatisch in dist Verzeichnis kopieren Allgemeine Java-Themen 0
T Ordner samt Dateien kopieren Allgemeine Java-Themen 11
Todesbote Zeilen aus Excel in andere Excel Tabelle kopieren Allgemeine Java-Themen 0
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P jar aus der jar kopieren XD Allgemeine Java-Themen 4
M Pakete in Ordner Kopieren Allgemeine Java-Themen 7
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
kodela Problem mit Kopieren über FileChannel Allgemeine Java-Themen 4
H Kopieren sehr langsam Allgemeine Java-Themen 5
I Java Ordner kopieren [Error] Allgemeine Java-Themen 6
E Files Kopieren Allgemeine Java-Themen 8
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
Z Ausschneiden, Kopieren, Einfügen, Löschen in JTextArea Allgemeine Java-Themen 5
S exe Kopieren Allgemeine Java-Themen 11
E Ordner rekursiv kopieren Allgemeine Java-Themen 8
J Standard-I´/O kopieren Allgemeine Java-Themen 5
R kopieren von Dateien und Verzeichnissen - UNICODE? Allgemeine Java-Themen 4
S Kopieren von Datei führt zu Beschädigung Allgemeine Java-Themen 7
D markierten Text kopieren Allgemeine Java-Themen 2
O ist tiefes Kopieren sinnvoll? Allgemeine Java-Themen 14
B Zertifikat des Users speichern (serialisieren oder kopieren) Allgemeine Java-Themen 2
S Dateiinhalt kopieren Allgemeine Java-Themen 4
G Object mit clone kopieren Allgemeine Java-Themen 21
F Kopieren eines Objekts Allgemeine Java-Themen 3
D Kopieren und Einfügen Allgemeine Java-Themen 8
C Kopieren von Dateien die von einem anderen Programm verwendet werden? Allgemeine Java-Themen 7
E Blob Element kopieren Allgemeine Java-Themen 12
0din Websites kopieren Allgemeine Java-Themen 25
D mit java kopieren und umbenennen Allgemeine Java-Themen 6
X Objektsammlung clonen bzw. kopieren Allgemeine Java-Themen 5
A Beim Kopieren werden Bilder verfälscht Allgemeine Java-Themen 3
V Dateien kopieren Allgemeine Java-Themen 6
N Daten auf Server kopieren Allgemeine Java-Themen 6
M Wie in Eclipse Quellcode incl. Zeilennummern kopieren? Allgemeine Java-Themen 6
G Daten von Excel kopieren - sinnvolle Datenstruktur? Allgemeine Java-Themen 3
P Eigene Klasse kopieren die auf sich selbst refferenziert Allgemeine Java-Themen 8
J Externes Programm - Konsolenausgabe kopieren/sichtbar machen Allgemeine Java-Themen 22
C File in Jar kopieren? Allgemeine Java-Themen 9
G ANT und Verzeichnisstruktur kopieren Allgemeine Java-Themen 2
G Datei löschen nach kopieren geht nicht Allgemeine Java-Themen 5
R Dateien lokal kopieren Allgemeine Java-Themen 6
P Objekt kopieren Allgemeine Java-Themen 8
hdi ArrayList kopieren? Allgemeine Java-Themen 8
G Datei kopieren Allgemeine Java-Themen 27
O Vektor kopieren (Inhalt, nicht Referenzen) Allgemeine Java-Themen 3
I Teile von ArrayList in eine andere kopieren? Allgemeine Java-Themen 2
V Datei kopieren und Datum erhalten Allgemeine Java-Themen 2
V Sich selbst kopieren (Jar- Datei) Allgemeine Java-Themen 3
G Code mit Zeilennummern kopieren? Allgemeine Java-Themen 3
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
M variable übergeben NICHT KOPIEREN Allgemeine Java-Themen 12
P String in Array kopieren Allgemeine Java-Themen 3
S Dateien auf Diskette kopieren Allgemeine Java-Themen 3
M Datei kopieren? Allgemeine Java-Themen 2
MQue Array in ein anderes Array kopieren Allgemeine Java-Themen 5
D aufruf beim kopieren Allgemeine Java-Themen 11
G Objekt dynamisch erstellen und Inhalte kopieren Allgemeine Java-Themen 6
K Datei kopieren Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben