web-dev-qa-db-ja.com

Java foreachループ:for(整数i:リスト){...}

以下のようにJDK5を使用する場合

_ArrayList<Integer> list = new ArrayList<Integer>();  
     for (Integer i : list) { 

      //cannot check if already reached last item

   }
_

一方、Iteratorを使用する場合

_ArrayList<Integer> list = new ArrayList<Integer>();
  for (Iterator i = list.iterator(); i.hasNext();) {

          //i can check whether this is last item
          if(i.hasNextItem()){
          }

    }
_

for (Integer i : list) {で最後のアイテムに既に到達しているかどうかを確認するにはどうすればよいですか

19
cometta

それを行う1つの方法は、カウンターを使用することです。

ArrayList<Integer> list = new ArrayList<Integer>();
...
int size = list.size();
for (Integer i : list) { 
    ...
    if (--size == 0) {
        // Last item.
        ...
    }
}

編集

とにかく、Tom Hawtinが言ったように、forループまたはiteratorを使用して、現在のインデックス情報を取得する必要がある場合、「古い」構文を使用する方がよい場合があります。 Java5構文を使用すると、ループ自体で失われます...

for (int i = 0; i < list.size(); i++) {
    ...

    if (i == (list.size() - 1)) {
        // Last item...
    }
}

または

for (Iterator it = list.iterator(); it.hasNext(); ) {
    ...

    if (!it.hasNext()) {
        // Last item...
    }
}
36
Romain Linsolas

場合によっては、イテレーターを使用した方が良い場合があります。

(申し立てによると、posh forループ内のインデックスのリクエストの「85%」は、String joinメソッドを実装するためのものです(これは簡単に行うことができます)。

APIはそれを直接サポートしていません。 for(int i ..)ループとcountを使用するか、subLists(0、size-1)を使用して最後の要素を明示的に処理できます。

  if(x.isEmpty()) return;
  int last = x.size() - 1;
  for(Integer i : x.subList(0, last)) out.println(i);
  out.println("last " + x.get(last));

これは、冗長性を導入しない場合にのみ役立ちます。 パフォーマンスが良いカウントバージョンよりも(subListオーバーヘッドが償却された後)。 (とにかくボクシングを気にかけた場合に備えて)。

4
Thomas Jung

別の方法として、パススルーオブジェクトを使用して最後の値をキャプチャし、それで何かを行うことができます。

List<Integer> list = new ArrayList<Integer>();
Integer lastValue = null;
for (Integer i : list) {
    // do stuff
    lastValue = i;
}
// do stuff with last value
3
Esko