Je veux avoir une vue de liste inversée sur une liste (d'une manière similaire à celle qui List#sublist
fournit une vue de sous-liste sur une liste). Y a-t-il une fonction qui fournit cette fonctionnalité?
Je ne veux pas faire de copie de la liste ni modifier la liste.
Ce serait suffisant si je pouvais obtenir au moins un itérateur inversé sur une liste dans ce cas.
De plus, je sais comment l'implémenter moi-même. Je demande simplement si Java fournit déjà quelque chose comme ça.
Mise en œuvre de la démonstration:
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(); }
};
}
};
}
Je viens de découvrir que certaines List
implémentations ont descendingIterator()
ce dont j'ai besoin. Bien qu'il n'y ait pas une telle mise en œuvre générale pour List
. Ce qui est LinkedList
assez étrange car l'implémentation que j'ai vue dans est assez générale pour fonctionner avec n'importe laquelle List
.
Collections.reverse(list)
Réponses:
La goyave fournit ceci: Lists.reverse (List)
Contrairement à
Collections.reverse
, c'est purement une vue ... cela ne modifie pas l'ordre des éléments dans la liste d'origine. En outre, avec une liste d'origine modifiable, les modifications apportées à la fois à la liste d'origine et à la vue sont répercutées dans l'autre.la source
List
) mais sans méthode inverse. le retirer a rendu la goyave à nouveau disponible.ListIterator.previous()
Utilisez la méthode .clone () sur votre liste. Il renverra une copie superficielle, ce qui signifie qu'il contiendra des pointeurs vers les mêmes objets, vous n'aurez donc pas à copier la liste. Ensuite, utilisez simplement Collections.
Ergo,
Si vous utilisez un
List
et que vous n'y avez pas accès,clone()
vous pouvez utilisersubList()
:la source
clone()
créerait normalement une copie de la liste. Quoi qu'il en soit,List#clone()
n'existe pas non plus.clone()
. Il fait en effet une copie complète de la liste (il ne clone pas seulement chaque objet de la liste mais ce n'est jamais ce dont je parlais).subList
ne copie pas, il fournit simplement une vue sur la liste sous-jacente, donc inverser cette vue inversera la liste sous-jacente.Si j'ai bien compris, c'est une ligne de code. Cela a fonctionné pour moi.
la source
Ce n'est pas exactement élégant, mais si vous utilisez List.listIterator (int index), vous pouvez obtenir un ListIterator bidirectionnel à la fin de la liste:
la source
Collections.reverse (nums) ... Il inverse en fait l'ordre des éléments. Le code ci-dessous devrait être très apprécié -
Sortie: 15,94,83,42,61
la source
java.util.Deque
adescendingIterator()
- si votreList
est unDeque
, vous pouvez l'utiliser.la source
Je sais que c'est un vieux post mais aujourd'hui je cherchais quelque chose comme ça. Finalement, j'ai écrit le code moi-même:
Non recommandé pour les longues listes, ce n'est pas du tout optimisé. C'est une sorte de solution facile pour les scénarios contrôlés (les listes que je gère ne contiennent pas plus de 100 éléments).
J'espère que ça aide quelqu'un.
la source
J'utilise ceci:
comme ça:
la source
Vous pouvez également le faire:
la source
Vous pouvez également inverser la position lorsque vous demandez un objet:
la source
Pour une liste de petite taille, nous pouvons créer
LinkedList
et ensuite utiliser l'itérateur descendant comme:la source
Utilisez des
reverse(...)
méthodes dejava.util.Collections
classe. Passez votre liste en paramètre et votre liste sera inversée.la source