Java цикл foreach: for (целое число i: список) {...} - PullRequest
19 голосов
/ 30 ноября 2009

Когда я использую 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) {

Ответы [ 4 ]

36 голосов
/ 30 ноября 2009

Один из способов сделать это - использовать счетчик:

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

Редактировать

В любом случае, как сказал Том Хоутин, иногда лучше использовать «старый» синтаксис, когда вам нужно получить текущую информацию индекса, используя цикл 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...
    }
}
9 голосов
/ 30 ноября 2009

Иногда лучше использовать итератор.

(Предположительно, «85%» запросов на индекс в шикарном цикле for предназначены для реализации метода соединения String (без которого вы легко можете обойтись).)

4 голосов
/ 30 ноября 2009

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

Это полезно, только если оно не вводит избыточность. Он работает лучше , чем версия для подсчета (после амортизации издержек подсписка). (На всякий случай, если вы все равно заботились о боксе).

3 голосов
/ 30 ноября 2009

Другим способом, вы можете использовать сквозной объект для захвата последнего значения и затем что-то с ним сделать:

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