Preciso executar uma lista na ordem inversa usando Java.
Então, onde isso encaminha:
for(String string: stringList){
//...do something
}
Existe alguma maneira de iterar o stringList na ordem inversa usando o para cada sintaxe?
Para maior clareza: sei como iterar uma lista em ordem inversa, mas gostaria de saber (por curiosidade) como fazê-lo para cada estilo.
Set
coleções derivadas.foreach
garante a iteração na ordem do iterador retornado doiterator()
método da coleção. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlRespostas:
O método Collections.reverse, na verdade, retorna uma nova lista com os elementos da lista original copiados nela na ordem inversa, portanto, esse desempenho tem O (n) em relação ao tamanho da lista original.
Como uma solução mais eficiente, você pode escrever um decorador que apresente uma visão invertida de uma lista como iterável. O iterador retornado pelo decorador usaria o ListIterator da lista decorada para percorrer os elementos na ordem inversa.
Por exemplo:
E você usaria como:
fonte
Para uma lista, você pode usar a Biblioteca do Google Guava :
Observe que não inverte toda a coleção ou faz algo parecido - apenas permite iteração e acesso aleatório, na ordem inversa. Isso é mais eficiente do que reverter a coleção primeiro.
Lists.reverse
Para reverter uma iteração arbitrária, você teria que ler tudo e depois "reproduzir" de trás para frente.
(Se você não estiver usando-lo, eu completamente recomendo que você tem um olhar para o Goiaba . É uma grande coisa.)
fonte
A Lista (diferente do Conjunto) é uma coleção ordenada e a iteração sobre ela preserva a ordem por contrato. Eu esperaria que um Stack iterasse na ordem inversa, mas infelizmente não. Portanto, a solução mais simples que consigo pensar é a seguinte:
Percebo que essa não é uma solução de loop "para cada". Prefiro usar o loop for do que introduzir uma nova biblioteca como as coleções do Google.
Collections.reverse () também faz o trabalho, mas atualiza a lista em vez de retornar uma cópia na ordem inversa.
fonte
for each
sintaxeIsso mexerá com a lista original e também precisará ser chamado fora do loop. Além disso, você não deseja executar um reverso toda vez que fizer um loop - isso seria verdade se um deles
Iterables.reverse ideas
fosse aplicado?fonte
AFAIK, não existe um tipo padrão de "reverse_iterator" na biblioteca padrão que suporte a sintaxe de cada um, que já é um açúcar sintático que eles trouxeram tarde para o idioma.
Você pode fazer algo como (elemento do item: myList.clone (). Reverse ()) e pagar o preço associado.
Isso também parece bastante consistente com o aparente fenômeno de não fornecer maneiras convenientes de executar operações caras - uma vez que uma lista, por definição, pode ter complexidade de acesso aleatório O (N) (você pode implementar a interface com um link único), reverter a iteração pode acabar sendo O (N ^ 2). Obviamente, se você possui um ArrayList, não paga esse preço.
fonte
Isso pode ser uma opção. Espero que exista uma maneira melhor de começar do último elemento do que para o loop while até o fim.
fonte
No comentário : você deve poder usar o Apache Commons
ReverseListIterator
Como o @rogerdpack disse , você precisa agrupar o arquivo
ReverseListIterator
como umIterable
.fonte
Não sem escrever um código personalizado que fornecerá um enumerador que reverterá os elementos para você.
Você deve conseguir fazer isso em Java, criando uma implementação customizada do Iterable que retornará os elementos na ordem inversa.
Em seguida, você instanciaria o wrapper (ou chamaria o método what-have-you) que retornaria a implementação Iterable que inverte o elemento no loop de cada loop.
fonte
Você pode usar a classe Collections http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html para reverter a lista e fazer um loop.
fonte
Você precisaria reverter sua coleção se quiser usar a sintaxe para cada caixa pronta e seguir na ordem inversa.
fonte
Todas as respostas acima cumprem apenas o requisito, envolvendo outro método ou chamando algum código estrangeiro para fora;
Aqui está a solução copiado do Thinking in Java 4ª edição , capítulo 11.13.1 AdapterMethodIdiom ;
Aqui está o código:
fonte
int current = size() - 1
certo? por que não oint current = this.size() - 1
ouint current = super.size() - 1
Um trabalho em torno de:
Ou com goiaba :
fonte
Definitivamente, uma resposta tardia a esta pergunta. Uma possibilidade é usar o ListIterator em um loop for. Não é tão limpo quanto a sintaxe dos dois pontos, mas funciona.
O crédito para a sintaxe do ListIterator vai para "Maneiras de iterar sobre uma lista em Java"
fonte