Desejo ter uma exibição de lista invertida em uma lista (de maneira semelhante ao que List#sublist
fornece uma exibição de sub-lista em uma lista). Existe alguma função que fornece essa funcionalidade?
Não quero fazer nenhum tipo de cópia da lista nem modificá-la.
Seria o suficiente se eu pudesse obter pelo menos um iterador reverso em uma lista nesse caso.
Além disso, eu sei como implementar isso sozinho. Só estou perguntando se o Java já fornece algo assim.
Implementação de demonstração:
static <T> Iterable<T> iterableReverseList(final List<T> l) {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
ListIterator<T> listIter = l.listIterator(l.size());
public boolean hasNext() { return listIter.hasPrevious(); }
public T next() { return listIter.previous(); }
public void remove() { listIter.remove(); }
};
}
};
}
Acabei de descobrir que algumas List
implementações têm o descendingIterator()
que eu preciso. Embora não exista essa implementação geral para List
. O que é meio estranho, porque a implementação que eu vi LinkedList
é geral o suficiente para funcionar com qualquer List
.
Collections.reverse(list)
Respostas:
A Goiaba fornece o seguinte: Lists.reverse (Lista)
Ao contrário
Collections.reverse
, essa é uma visão puramente ... não altera a ordem dos elementos na lista original. Além disso, com uma lista original modificável, as alterações na lista original e na exibição são refletidas na outra.fonte
List
), mas sem método reverso. removê-lo tornou a goiaba disponível novamente.ListIterator.previous()
Use o método .clone () na sua lista. Ele retornará uma cópia superficial, o que significa que conterá ponteiros para os mesmos objetos, para que você não precise copiar a lista. Depois, basta usar Coleções.
Ergo,
Se você estiver usando um
List
e não tiver acesso,clone()
poderá usarsubList()
:fonte
clone()
normalmente criaria uma cópia da lista. Enfim,List#clone()
também não existe.clone()
. Na verdade, ele faz uma cópia completa da lista (apenas não clona cada objeto da lista, mas nunca foi sobre isso que eu estava falando).subList
não copia, apenas fornece uma exibição na lista subjacente; portanto, reverter essa exibição reverterá a lista subjacente.Se eu entendi correto, então é uma linha de código. Funcionou para mim.
fonte
Não é exatamente elegante, mas se você usar List.listIterator (int index), poderá obter um ListIterator bidirecional no final da lista:
fonte
Collections.reverse (nums) ... Na verdade, inverte a ordem dos elementos. O código abaixo deve ser muito apreciado -
Saída: 15,94,83,42,61
fonte
java.util.Deque
hasdescendingIterator()
- se vocêList
é umDeque
, você pode usá-lo.fonte
Eu sei que este é um post antigo, mas hoje eu estava procurando por algo assim. No final, eu mesmo escrevi o código:
Não recomendado para listas longas, isso não é otimizado. É uma solução fácil para cenários controlados (as Listas que mantenho não têm mais que 100 elementos).
Espero que ajude alguém.
fonte
Eu uso isso:
como isso:
fonte
Você também pode fazer isso:
fonte
Você também pode inverter a posição ao solicitar um objeto:
fonte
Para lista de tamanho pequeno, podemos criar
LinkedList
e usar o iterador descendente como:fonte
Use
reverse(...)
métodos dejava.util.Collections
classe. Passe sua lista como parâmetro e sua lista será revertida.fonte