Im Moment habe ich ein Programm, das einen Code enthält, der so aussieht:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
// do something
}
}
Mache ich das richtig, was das Durchlaufen der ArrayList angeht?
Der Fehler, den ich bekomme, ist:
java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.get(Unknown Source)
at main1.endElement(main1.java:244)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at main1.traverse(main1.java:73)
at main1.traverse(main1.java:102)
at main1.traverse(main1.java:102)
at main1.main(main1.java:404)
Ich würde den Rest des Codes zeigen, aber er ist ziemlich umfangreich, und wenn ich die Iteration nicht richtig mache, würde ich annehmen, dass die einzige Möglichkeit darin besteht, dass ich den Code nicht ArrayList
richtig initialisiere .
java
arraylist
iterator
indexoutofboundsexception
Dieser 0ne Pr0grammer
quelle
quelle
forEach
Methode verwenden: stackoverflow.com/questions/16635398/…Antworten:
Nein: Wenn Sie
iterator
in jeder Iteration zweimal aufrufen , erhalten Sie ständig neue Iteratoren.Der einfachste Weg, diese Schleife zu schreiben, ist die Verwendung des for-each- Konstrukts:
Wie für
Sie haben gerade versucht, die Elementnummer
-1
aus einem Array abzurufen. Die Zählung beginnt bei Null.quelle
do array.each |s| unless (s.nil?) end end
Have you heard of
scheint irgendwie beleidigend (ohne Grund), aber ich bin nicht einheimisch. Ansonsten super.Obwohl ich der Meinung bin, dass die akzeptierte Antwort normalerweise die beste Lösung ist und definitiv einfacher zu verwenden ist, habe ich festgestellt, dass niemand die richtige Verwendung des Iterators angezeigt hat. Hier ist ein kurzes Beispiel:
quelle
oder
Aber seien Sie vorsichtig. ArrayList kann Nullwerte enthalten . Vergleich sollte also sein
Wenn Sie sicher sind, dass der Wert nicht null ist, oder wenn Sie überprüfen sollten, ob das angegebene Element null ist.
quelle
Sie können auch wie folgt verwenden:
Es ist eine gute Praxis, das Objekt zu gießen und zu verwenden. Zum Beispiel, wenn die 'arrayList' eine Liste von 'Object1'-Objekten enthält. Dann können wir den Code wie folgt neu schreiben:
quelle
Sie können auch eine for-Schleife wie für ein Array ausführen, aber anstelle von array [i] würden Sie list.get (i) verwenden.
quelle
Abgesehen von der Antwort von larsmans (wer ist in der Tat richtig) ist die Ausnahme bei einem Aufruf einer get () -Methode, sodass der von Ihnen veröffentlichte Code nicht derjenige ist, der den Fehler verursacht.
quelle
Effizient zu Iterierte Ihr
ArrayList
von diesem gefolgt Link . Dieser Typ verbessert die Leistung der Schleife während der Iterationquelle
Das Iterieren mit dem Iterator ist nicht ausfallsicher. Wenn Sie beispielsweise nach der Erstellung des Iterators ein Element zur Sammlung hinzufügen, wird eine gleichzeitige Modifikationsausnahme ausgelöst. Außerdem ist es nicht threadsicher, Sie müssen es extern threadsicher machen.
Daher ist es besser, für jede Struktur eine for-Schleife zu verwenden. Es ist zumindest ausfallsicher.
quelle