Java foreach loop: for (Integer i: list) {...}

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

Ответ 1

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

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

Ответ 2

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

(Утверждается, что "85%" запросов на индекс в цикле posh для реализации метода соединения String (с которым вы можете легко обойтись).

Ответ 3

API не поддерживает это напрямую. Вы можете использовать цикл for (int i..) и count элементы или использовать сублисты (0, размер - 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

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

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