Je répète une ArrayList
en utilisant le pour chaque boucle, mais je ne sais pas comment obtenir l'index actuel où se trouve la boucle.
Je l'ai fait sur Google, mais je n'ai rien trouvé d'utile.
S'il vous plaît, si quelqu'un pouvait me dire comment obtenir l'indice actuel, je vous en serais reconnaissant.
Utilisez simplement une boucle for traditionnelle:
for (int i = 0; i < yourArrayList.size(); i ++) {
// i is the index
// yourArrayList.get(i) is the element
}
Voler les poignées de porte, mais apporter un changement qui me rendrait fou comme un pirate:
int arraySize = yourArrayList.size();
for (int i = 0; i < arraySize; i ++) {
// i is the index
// yourArrayList.get(i) is the element
}
alternativement
int currentPosition = 0;
for (myItemType myItem :myArrayList) {
// do stuff
currentPosition++;
}
Vous pouvez utiliser list.indexOf(objectYouWantToFind);
pour obtenir son index s'il se trouve dans le conteneur, sinon vous recevrez -1
en conséquence.
Utilisez une boucle traditionnelle. Les instructions for-each en Java ne promettent pas un ordre sur la collection. Le seul moyen de connaître réellement l'index consiste à interroger la liste à chaque itération.
for(int i=0; i<list.size; i++){
// you have your index, i
// the item is at list.get(i)
}
En utilisant l'implémentation iterator (), vous pouvez également utiliser une alternative (+1 Zak dans les commentaires):
int position = 0;
for(Item i : list){
// do stuff with `i`
// increase position as the last action in the loop
position++;
}
De la documentation: Iterator<E> iterator() Returns an iterator over the elements in this list in proper sequence
Voici pourquoi (généralement) n'utilisez pas la forme abrégée de for
:
import Java.util.ArrayList;
import Java.util.Iterator;
public class MyList<T> extends ArrayList<T> {
// the main function to run the example
public static void main(String[] args){
// make a list of my special type
MyList<Integer> list = new MyList<Integer>();
// add 10 items to it
for (int i =0; i<10; i++){
list.add(i);
}
// print the list using the for-each mechanism (it's actually an iterator...)
for (Integer i : list){
System.out.println(i);
}
}
// I like lists that start at 3!
// make my list return an iterator in the middle of the list...
@Override
public Iterator<T> iterator(){
return this.listIterator(3);
}
}
De toute évidence, vous vous attendez à ce que le premier élément de la première itération apparaisse, et ce n'est clairement pas le cas, car un itérateur peut être implémenté de nombreuses manières et la variable foreach
de Java dépend de l'implémentation iterator
sous-jacente.
De plus, vous devez utiliser position++
à la fin de votre boucle, ce qui est sujet aux erreurs probablement (ne sait pas, ne l'utilisez pas habituellement ...).
Cela dit, cela améliore la lisibilité, comme mentionné dans ce stackoverflow question à propos de foreach de Java.
Pour plus d'informations, voir Comment fonctionne le langage Java pour chaque boucle? .
S'il s'agit d'une liste, vous pouvez utiliser la méthode indexOf (), exemple:
List<Animal> animals = new ArrayList<Animal>();
Animal a = new Animal();
a.setAnimalCode(1);
animals.add(a);
a = new Animal();
a.setAnimalCode(35);
animals.add(a);
a = new Animal();
a.setAnimalCode(12);
animals.add(a);
for(Animal a: animals)
if(animal.getAnimalCode()==35)
System.out.println("Index of chosen one: "+animals.indexOf(a));
Indice de l'élu: 2
Une sorte de bidouille, mais vous pouvez sûrement avoir un index dans une boucle pour chaque boucle:
public class Counter{
private Integer i;
public Counter(Integer i) { this.i = i; }
public void incrementOne(){ this.i = getI() + 1; }
//getter and setter for i
}
Et, quelque part ailleurs dans votre pour chaque boucle:
Alien.Java
Counter counter = new Counter(0);
List<String> list = new ArrayList<>();
//have some values in the list
list.forEach(i-> {
//i will have the value and the counter will have the count!
System.out.println(counter.getI());
counter.incrementOne();
});
Sinon, vous avez toujours un list.indexOf (i), où i est chaque objet de la liste. : P