Estou migrando um pedaço de código para fazer uso de genéricos. Um argumento para fazer isso é que o loop for é muito mais limpo do que controlar os índices ou usar um iterador explícito.
Em cerca de metade dos casos, a lista (um ArrayList) está sendo iterada na ordem inversa, usando um índice hoje.
Alguém pode sugerir uma maneira mais limpa de fazer isso (já que eu não gosto indexed for loop
quando trabalho com coleções), embora funcione?
for (int i = nodes.size() - 1; i >= 0; i--) {
final Node each = (Node) nodes.get(i);
...
}
Nota: Não consigo adicionar novas dependências fora do JDK.
java
collections
Allain Lalonde
fonte
fonte
for (int i = nodes.size(); --i >= 0;)
Respostas:
Tente o seguinte:
fonte
listIterator
ligação, eu acho.Iterator
que use umListIterator
no sentido inverso, mas que pode não valer a pena para um loop.for (Node each : new ListReverse<Node>(nodes)) { }
Goiaba
Lists#reverse(List)
e ofertasImmutableList#reverse()
. Como na maioria dos casos para o Goiaba, o primeiro delega para o último se o argumento for umImmutableList
, então você pode usá-lo em todos os casos. Isso não cria novas cópias da lista, mas apenas "visões invertidas" dela.Exemplo
fonte
Eu não acho que é possível usar a sintaxe do loop for. A única coisa que posso sugerir é fazer algo como:
... mas eu não diria que isso é "mais limpo", uma vez que será menos eficiente.
fonte
Opção 1: Você pensou em reverter a lista com coleções # reverse () e depois usar o foreach?
Obviamente, você também pode refatorar seu código, de modo que a lista seja ordenada corretamente, para que você não precise revertê-lo, o que utiliza espaço / tempo extra.
EDITAR:
Opção 2: Como alternativa, você poderia usar um Deque em vez de um ArrayList? Permite iterar para frente e para trás
EDITAR:
Opção 3: Como outros sugeriram, você pode escrever um Iterador que percorrerá a lista ao contrário, e aqui está um exemplo:
fonte
descendingIterator()
.for each
expressão é a solução mais idiomática na minha opinião. É bom perceber que isso é possível se a sua Lista implementar o Iterable de uma maneira que itere para trás. Vou usar essa abordagem e usar a classe ReverseListIterator da Apache Commons Collections.Você poderia usar a classe concreta em
LinkedList
vez da interface geralList
. Então você tem umdescendingIterator
para iterar com a direção reversa.Não sei por que não há
descendingIterator
comArrayList
...fonte
Esta é uma pergunta antiga, mas está faltando uma resposta amigável para java8. Aqui estão algumas maneiras de reverter a iteração da lista, com a ajuda da API de streaming:
fonte
Aqui está uma implementação (não testada) de a
ReverseIterable
. Quandoiterator()
é chamado, ele cria e retorna umaReverseIterator
implementação privada , que simplesmente mapeia as chamadashasNext()
parahasPrevious()
e as chamadas paranext()
são mapeadasprevious()
. Isso significa que você pode iterar umArrayList
inverso da seguinte maneira:Definição de classe
fonte
ReverseIterator
está faltando o construtor necessário e o código deve ser usado emList
vez deArrayList
.Se as listas forem razoavelmente pequenas para que o desempenho não seja um problema real, é possível usar o
reverse
método-daLists
classe-inGoogle Guava
.for-each
Produz um código bonito e a lista original permanece a mesma. Além disso, a lista invertida é apoiada pela lista original, portanto, qualquer alteração na lista original será refletida na lista invertida.Rende o seguinte resultado:
O que significa que a iteração reversa do myList pode ser escrita como:
fonte
Crie um costume
reverseIterable
.fonte
Exemplo muito simples:
fonte
Você pode usar
ReverseListIterator
as coleções-Apache Commons:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/iterators/ReverseListIterator.html
fonte
Também encontrou o método reverso das coleções do google .
fonte
Para ter um código parecido com este:
Coloque esse código em um arquivo chamado "In.java":
fonte
listIterator
campo precisa estar dentro daIterator
implementação, não naIterable
implementação.name()
método, umordinal()
método e umstatic valueOf()
método, por exemplo.Como foi sugerido pelo menos duas vezes, você pode usar
descendingIterator
com aDeque
, em particular com aLinkedList
. Se você quiser usar o loop for-each (ou seja, possuir umIterable
), poderá construir e usar um wraper como este:fonte
Razão: "Não sei por que não há descendingIterator com ArrayList ..."
Como a lista de matrizes não mantém a lista na mesma ordem em que os dados foram adicionados à lista. Portanto, nunca use Arraylist.
A lista vinculada manterá os dados na mesma ordem de ADD para listar.
Então, acima no meu exemplo, usei ArrayList () para fazer com que o usuário torça a cabeça e faça com que exercite algo do lado deles.
Em vez disso
USAR:
fonte