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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top