获取迭代ArrayList的每个循环的当前索引

时间:2014-01-07 00:03:42

标签: java arraylist foreach indexing

我正在使用for循环迭代ArrayList,但我不知道如何获取循环所在的当前索引。

我做谷歌,但我找不到任何有用的东西。

如果有人能告诉我如何获取当前指数,请不要感激。

6 个答案:

答案 0 :(得分:37)

只需使用传统的for循环:

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

答案 1 :(得分:8)

要窃取门把手的答案,但要做出改变,否则会让我像海盗一样疯狂:

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

替代地

int currentPosition = 0;
for (myItemType myItem :myArrayList) {
    // do stuff

    currentPosition++;
}

答案 2 :(得分:5)

您可以使用list.indexOf(objectYouWantToFind);获取其索引(如果它位于容器中),否则您将收到-1

答案 3 :(得分:2)

使用传统循环。 For-each中的每个语句都不承诺对集合的订单。实际知道索引的唯一方法是在每次迭代时查询列表。

for(int i=0; i<list.size; i++){
    // you have your index, i
    // the item is at list.get(i)
}

依赖于iterator()实现,您还可以使用替代方法(注释中为+1 Zak):

int position = 0;
for(Item i : list){

    // do stuff with `i`

    // increase position as the last action in the loop
    position++;
}

来自文档:Iterator<E> iterator() Returns an iterator over the elements in this list in proper sequence

这就是我通常不使用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);

    }

}

显然,你期望在第一次迭代中有第一个项目,显然不是这种情况,因为迭代器可以通过多种方式实现,Java foreach依赖于底层{{1}实施。

此外,您必须在循环结束时使用iterator 可能容易出错(不知道,通常不会使用它。)。< / p>

也就是说,它确实提高了这个stackoverflow question中提到的关于Java的foreach的可读性。

有关详细信息,请参阅How does the Java for each loop work?

答案 4 :(得分:0)

如果它正在迭代List,您可以使用方法indexOf(),例如:

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));

所选择的指数:2

答案 5 :(得分:0)

有点像黑客攻击,但你肯定可以在每个循环中都有一个索引:

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
}

而且,在每个循环的其他地方:

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();
});

否则,您总是有一个list.indexOf(i),其中i是列表中的每个对象。 :P