Je migre un morceau de code pour utiliser des génériques. Un argument pour cela est que la boucle for est beaucoup plus propre que de garder une trace des index, ou d'utiliser un itérateur explicite.
Dans environ la moitié des cas, la liste (une ArrayList) est itérée dans l'ordre inverse en utilisant un index aujourd'hui.
Quelqu'un peut-il suggérer une façon plus propre de le faire (car je n'aime pas cela indexed for loop
lorsque je travaille avec des collections), bien que cela fonctionne?
for (int i = nodes.size() - 1; i >= 0; i--) {
final Node each = (Node) nodes.get(i);
...
}
Remarque: je ne peux pas ajouter de nouvelles dépendances en dehors du JDK.
java
collections
Allain Lalonde
la source
la source
for (int i = nodes.size(); --i >= 0;)
Réponses:
Essaye ça:
la source
listIterator
appel, je pense.Iterator
qui utilise unListIterator
inversé, mais cela ne vaut peut-être pas la peine pour une boucle.for (Node each : new ListReverse<Node>(nodes)) { }
Offres de goyave
Lists#reverse(List)
etImmutableList#reverse()
. Comme dans la plupart des cas pour Guava, les anciens délèguent à ces derniers si l'argument est unImmutableList
, vous pouvez donc utiliser les premiers dans tous les cas. Ceux-ci ne créent pas de nouvelles copies de la liste mais simplement des "vues inversées" de celle-ci.Exemple
la source
Je ne pense pas qu'il soit possible d'utiliser la syntaxe de boucle for. La seule chose que je peux suggérer est de faire quelque chose comme:
... mais je ne dirais pas que c'est "plus propre" étant donné que ça va être moins efficace.
la source
Option 1: Avez-vous pensé à inverser la liste avec Collections # reverse () puis à utiliser foreach?
Bien sûr, vous voudrez peut-être également refactoriser votre code afin que la liste soit ordonnée correctement afin que vous n'ayez pas à l'inverser, ce qui utilise un espace / temps supplémentaire.
ÉDITER:
Option 2: Alternativement, pourriez-vous utiliser un Deque au lieu d'un ArrayList? Il vous permettra d'itérer en avant et en arrière
ÉDITER:
Option 3: Comme d'autres l'ont suggéré, vous pouvez écrire un Iterator qui parcourra la liste à l'envers, voici un exemple:
la source
descendingIterator()
.for each
expression est à mon avis la solution la plus idiomatique. Il est agréable de réaliser que cela est possible si votre liste implémente Iterable d'une manière qui se répète en arrière. Je vais utiliser cette approche et utiliser la classe ReverseListIterator des collections Apache Commons.Vous pouvez utiliser la classe concrète au
LinkedList
lieu de l'interface généraleList
. Ensuite, vous avez undescendingIterator
pour itérer avec la direction inverse.Je ne sais pas pourquoi il n'y a pas
descendingIterator
deArrayList
...la source
C'est une vieille question, mais il manque une réponse adaptée à java8. Voici quelques façons de réitérer la liste, à l'aide de l'API Streaming:
la source
Voici une implémentation (non testée) de a
ReverseIterable
. Quanditerator()
est appelé, il crée et renvoie uneReverseIterator
implémentation privée , qui mappe simplement les appelshasNext()
vershasPrevious()
et les appels versnext()
sont mappés versprevious()
. Cela signifie que vous pouvez parcourir uneArrayList
marche arrière comme suit:Définition de classe
la source
ReverseIterator
manque le constructeur nécessaire et le code doit utiliser à laList
place deArrayList
.Si les listes sont assez petites pour que les performances ne soient pas un vrai problème, on peut utiliser le
reverse
-metod de laLists
classe-inGoogle Guava
. Donne un jolifor-each
code et la liste d'origine reste la même. De plus, la liste inversée est sauvegardée par la liste d'origine, donc toute modification apportée à la liste d'origine sera reflétée dans la liste inversée.Donne le résultat suivant:
Ce qui signifie que l'itération inverse de myList peut s'écrire:
la source
Créez une coutume
reverseIterable
.la source
Exemple très simple:
la source
Vous pouvez utiliser
ReverseListIterator
depuis Apache Commons-Collections:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/iterators/ReverseListIterator.html
la source
On trouve également la méthode inverse des collections google .
la source
Pour avoir un code qui ressemble à ceci:
Mettez ce code dans un fichier appelé "In.java":
la source
listIterator
champ doit être à l'intérieur de l'Iterator
implémentation, pas l'Iterable
implémentation.name()
méthode, uneordinal()
méthode et unestatic valueOf()
méthode, par exemple.Comme cela a été suggéré au moins deux fois, vous pouvez utiliser
descendingIterator
avec unDeque
, en particulier avec unLinkedList
. Si vous souhaitez utiliser la boucle for-each (c'est-à-dire avoir unIterable
), vous pouvez construire et utiliser un wrapper comme celui-ci:la source
Raison: "Je ne sais pas pourquoi il n'y a pas d'itérateur descendant avec ArrayList ..."
Étant donné que la liste de tableaux ne conserve pas la liste dans le même ordre que les données ont été ajoutées à la liste. Donc, n'utilisez jamais Arraylist.
La liste liée gardera les données dans le même ordre que AJOUTER à la liste.
Donc, ci-dessus dans mon exemple, j'ai utilisé ArrayList () afin de faire en sorte que l'utilisateur tord son esprit et lui fasse faire quelque chose de son côté.
Au lieu de cela
UTILISATION:
la source