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