En este momento, tengo un programa que contiene un fragmento de código que se ve así:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
// do something
}
}
¿Lo estoy haciendo bien, en lo que respecta a la iteración a través de ArrayList?
El error que recibo es:
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)
Mostraría el resto del código, pero es bastante extenso, y si no estoy haciendo la iteración correctamente, asumiría que la única posibilidad es que no estoy inicializando ArrayList
correctamente.
java
arraylist
iterator
indexoutofboundsexception
Este programador
fuente
fuente
forEach
método: stackoverflow.com/questions/16635398/…Respuestas:
No: al llamar
iterator
dos veces en cada iteración, obtiene nuevos iteradores todo el tiempo.La forma más sencilla de escribir este bucle es usar la construcción for-each :
Como para
Intentaste obtener el número de elemento
-1
de una matriz. El conteo comienza en cero.fuente
do array.each |s| unless (s.nil?) end end
Have you heard of
parece un poco ofensivo (sin ninguna razón), pero no soy nativo. Por lo demás genial.Si bien estoy de acuerdo en que la respuesta aceptada suele ser la mejor solución y definitivamente más fácil de usar, noté que nadie mostró el uso adecuado del iterador. Así que aquí hay un ejemplo rápido:
fuente
o
Pero tenga cuidado, ArrayList puede contener valores nulos . Entonces la comparación debería ser
cuando esté seguro de que el valor no es nulo o debe verificar si el elemento dado es nulo.
fuente
También puedes usar así:
Es una buena práctica lanzar y usar el objeto. Por ejemplo, si 'arrayList' contiene una lista de objetos 'Object1'. Luego, podemos reescribir el código como:
fuente
También puede hacer un bucle for como lo haría con una matriz, pero en lugar de la matriz [i], usaría list.get (i)
fuente
Aparte de la respuesta de larsman (que de hecho es correcta), la excepción en una llamada a un método get (), por lo que el código que ha publicado no es el que está causando el error.
fuente
Manera eficiente de iterar su
ArrayList
seguido por este enlace . Este tipo mejorará el rendimiento del bucle durante la iteración.fuente
iterar usando el iterador no es a prueba de fallas, por ejemplo, si agrega un elemento a la colección después de la creación del iterador, arrojará una excepción de modificación simultánea. Además, no es seguro para subprocesos, tienes que hacer que sea seguro para subprocesos externamente.
Por lo tanto, es mejor usar la estructura for-each de for loop. Es al menos a prueba de fallas.
fuente