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 me trompe, autant que faire se passe dans la liste de tableaux?
L'erreur que je reçois est la suivante:
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 il est assez volumineux et si je ne fais pas l’itération correctement, je suppose que la seule possibilité est que je n’initialise pas correctement la ArrayList
.
Est-ce que je me trompe, dans la mesure où cela se répète dans l'Arraylist?
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 est d'utiliser la construction pour-chacun :
for (String s : arrayList)
if (s.equals(value))
// ...
Pour ce qui est de
Java.lang.ArrayIndexOutOfBoundsException: -1
Vous venez d'essayer d'obtenir le numéro d'élément -1
d'un tableau. Le décompte commence à zéro.
Bien que je convienne que la réponse acceptée est généralement la meilleure solution et certainement plus facile à utiliser, j’ai remarqué que personne n’a affiché le bon usage de l’itérateur. Alors voici un exemple rapide:
Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
Object obj = it.next();
//Do something with obj
}
List<String> arrayList = new ArrayList<String>();
for (String s : arrayList) {
if(s.equals(value)){
//do something
}
}
ou
for (int i = 0; i < arrayList.size(); i++) {
if(arrayList.get(i).equals(value)){
//do something
}
}
Mais soyez prudent ArrayList peut contenir des valeurs nulles. Donc, la comparaison devrait être
value.equals(arrayList.get(i))
quand vous êtes sûr que la valeur n'est pas nulle ou vous devriez vérifier si l'élément donné est nul.
Vous pouvez également utiliser comme ceci:
for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = iterator.next();
//do some stuff
}
C'est une bonne pratique pour lancer et utiliser l'objet. Par exemple, si 'arrayList' contient une liste d'objets 'Object1'. Ensuite, nous pouvons réécrire le code en tant que:
for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = (Object1) iterator.next();
//do some stuff
}
Vous pouvez aussi faire une boucle for comme vous le feriez pour un tableau, mais au lieu de tableau [i], vous utiliseriez list.get (i).
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
À part larsmans answer (qui est en effet correct), l'exception d'un appel à une méthode get (), de sorte que le code que vous avez publié n'est pas celui qui a provoqué l'erreur.
Moyen efficace d'itérer votre ArrayList
suivi de ceci lien . Ce type améliorera les performances de la boucle lors de l'itération
int size = list.size();
for(int j = 0; j < size; j++) {
System.out.println(list.get(i));
}
itérer à l'aide d'un itérateur n'est pas sûr, par exemple, si vous ajoutez un élément à la collection après la création d'un itérateur, il lancera alors une exceptionModificaionexception concurrente. En outre, il n'est pas thread-safe, vous devez le rendre thread-safe extérieurement.
Il est donc préférable d'utiliser for-chaque structure de for loop. C'est au moins un coffre-fort.