Java foreach loop: para (Integer i: lista) {...}
Pergunta
Quando eu uso JDK5 como abaixo
ArrayList<Integer> list = new ArrayList<Integer>();
for (Integer i : list) {
//cannot check if already reached last item
}
Por outro lado, se eu usar apenas um 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()){
}
}
Como posso verificar último item se eu já alcançado com for (Integer i : list) {
Solução
Uma maneira de fazer isso é usar um contador:
ArrayList<Integer> list = new ArrayList<Integer>();
...
int size = list.size();
for (Integer i : list) {
...
if (--size == 0) {
// Last item.
...
}
}
Editar
De qualquer forma, como disse Tom Hawtin, às vezes é melhor usar a sintaxe "velho" quando você precisa para obter as informações de índice atual, usando um loop for
ou o iterator
, como tudo o que você ganha quando usando a sintaxe vontade Java5 ser perdido no circuito em si ...
for (int i = 0; i < list.size(); i++) {
...
if (i == (list.size() - 1)) {
// Last item...
}
}
ou
for (Iterator it = list.iterator(); it.hasNext(); ) {
...
if (!it.hasNext()) {
// Last item...
}
}
Outras dicas
Às vezes é apenas melhor usar um iterador.
(Alegadamente, "85%" dos pedidos de um índice no elegante laço for é para implementar um String
método de junção (que você pode facilmente fazer sem).)
A API não suporta isso diretamente. Você pode usar o for (int i ..) loop e count os elementos ou uso sublists (0, tamanho - 1) e lidar com o último elemento explicitamente:
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));
Isto só é útil se não introduzir redundância. It executa melhor do que a versão de contagem (após a sobrecarga subList é amortizado). (Apenas no caso de você se importou após o boxe de qualquer maneira).
Outra maneira, você pode usar um pass-through objeto para capturar o último valor e, em seguida, fazer algo com ele:
List<Integer> list = new ArrayList<Integer>();
Integer lastValue = null;
for (Integer i : list) {
// do stuff
lastValue = i;
}
// do stuff with last value