En ce moment, j'ai un programme contenant un morceau de code qui ressemble à ceci:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
// do something
}
}
Est-ce que je fais cela correctement, en ce qui concerne l'itération dans ArrayList?
L'erreur que j'obtiens est:
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)
Je montrerais le reste du code, mais c'est assez étendu, et si je ne fais pas l'itération correctement, je suppose que la seule possibilité est que je ne l'initialise pas ArrayList
correctement.
java
arraylist
iterator
indexoutofboundsexception
Ce 0ne Pr0grammer
la source
la source
forEach
méthode: stackoverflow.com/questions/16635398/…Réponses:
Non: en appelant
iterator
deux fois à chaque itération, vous obtenez de nouveaux itérateurs tout le temps.Le moyen le plus simple d'écrire cette boucle consiste à utiliser la construction for-each :
Pour ce qui est de
Vous venez d'essayer d'obtenir le numéro d'élément
-1
d'un tableau. Le comptage commence à zéro.la source
do array.each |s| unless (s.nil?) end end
Have you heard of
semble assez offensant (sans raison), mais je ne suis pas natif. Sinon super.Bien que je convienne que la réponse acceptée est généralement la meilleure solution et certainement plus facile à utiliser, je n'ai remarqué que personne n'a affiché l'utilisation appropriée de l'itérateur. Voici donc un exemple rapide:
la source
ou
Mais attention, ArrayList peut contenir des valeurs nulles . La comparaison devrait donc être
lorsque vous êtes sûr que la valeur n'est pas nulle ou que vous devez vérifier si l'élément donné est nul.
la source
Vous pouvez également utiliser comme ceci:
C'est une bonne pratique de lancer et d'utiliser l'objet. Par exemple, si le 'arrayList' contient une liste d'objets 'Object1'. Ensuite, nous pouvons réécrire le code comme suit:
la source
Vous pouvez également faire une boucle for comme vous le feriez pour un tableau, mais au lieu de array [i], vous utiliseriez list.get (i)
la source
Hormis la réponse de larsmans (qui est en effet correcte), l'exception dans un appel à une méthode get (), donc le code que vous avez posté n'est pas celui qui cause l'erreur.
la source
Moyen efficace d'itérer votre
ArrayList
suivi de ce lien . Ce type améliorera les performances de la boucle pendant l'itérationla source
itérer à l'aide de l'itérateur n'est pas sécurisé. Par exemple, si vous ajoutez un élément à la collection après la création de l'itérateur, il lèvera une exception concurrentmodificaionexception. De plus, ce n'est pas thread-safe, vous devez le rendre thread-safe en externe.
Il est donc préférable d'utiliser pour chaque structure de boucle for. C'est au moins à sécurité intégrée.
la source