web-dev-qa-db-ja.com

ArrayListを反復する各ループの現在のインデックスを取得します

For eachループを使用してArrayListを繰り返していますが、ループの現在のインデックスを取得する方法がわかりません。

私はそれをグーグルでやったが、何も役に立たなかった。

誰かが現在のインデックスを取得する方法を教えてくれたら、ありがたいです。

22
Ichigo Kurosaki

従来のforループを使用するだけです。

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

ドアノブの答えを盗むが、そうでなければ海賊のように私を動かしてしまうような変更を加えるには:

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

list.indexOf(objectYouWantToFind);を使用して、コンテナ内にある場合はインデックスを取得できます。それ以外の場合は、-1 結果として。

6
Omar Sebres

従来のループを使用します。 Javaの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は基礎となるiteratorに依存するため、明らかにそうではありません実装。

また、ループの最後で_position++_を使用する必要があります。これはおそらくエラーが発生しやすい(わかりません、しないでください)通常それを使用します..)。

とは言っても、このstackoverflowで言及されているように読みやすさは向上します question Javaのforeachについて。

詳細については、 Javaはどのように機能しますか? を参照してください。

2
Reut Sharabani

リストを繰り返し処理する場合は、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

0
Maelo

ハッキングのようなものですが、for eachループには必ずインデックスを付けることができます。

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
}

そして、for eachループのどこか別の場所:

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

0