web-dev-qa-db-fra.com

Obtenir l'index actuel de a pour chaque boucle en itérant une ArrayList

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.

21
Ichigo Kurosaki

Utilisez simplement une boucle for traditionnelle:

for (int i = 0; i < yourArrayList.size(); i ++) {
    // i is the index
    // yourArrayList.get(i) is the element
}
36
Doorknob

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++;
}
8
Zak

Vous pouvez utiliser list.indexOf(objectYouWantToFind); pour obtenir son index s'il se trouve dans le conteneur, sinon vous recevrez -1 en conséquence.

5
Omar Sebres

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? .

2
Reut Sharabani

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

0
Maelo

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

0