Quelle est la manière la plus simple d'inverser cette ArrayList?
ArrayList<Integer> aList = new ArrayList<>();
//Add elements to ArrayList object
aList.add("1");
aList.add("2");
aList.add("3");
aList.add("4");
aList.add("5");
while (aList.listIterator().hasPrevious())
Log.d("reverse", "" + aList.listIterator().previous());
Ce n'est pas le moyen le plus simple, mais si vous êtes un fan de la récursivité, vous pourriez être intéressé par la méthode suivante pour inverser une ArrayList:
Ou de façon non récursive:
la source
int j
mis à jour à chaque itération? Vous l'initialisez àj = list.size() - 1
mais je ne pense pas que la section d' initialisation dufor loop
soit mise à jour à chaque itération, n'est-ce pas?IndexOutOfBoundsException
puisque vous essayez d'accéder auj
(dernier index de la liste de tableaux d'origine) mais vous avez déjà supprimé l'objet à cet index?add()
pousse les autres éléments dans le tableau, donc le tableau reste essentiellement une taille constante. Des solutions intéressantes, merci!L'astuce consiste ici à définir «inverse». On peut modifier la liste en place, créer une copie dans l'ordre inverse ou créer une vue dans l'ordre inverse.
La manière la plus simple, intuitivement parlant , est
Collections.reverse
:Cette méthode modifie la liste en place . Autrement dit,
Collections.reverse
prend la liste et écrase ses éléments, ne laissant aucune copie non inversée derrière. Cela convient à certains cas d'utilisation, mais pas à d'autres; en outre, il suppose que la liste est modifiable. Si cela est acceptable, nous sommes bons.Sinon, on pourrait créer une copie dans l'ordre inverse :
Cette approche fonctionne, mais nécessite une itération sur la liste deux fois. Le constructeur de copie (
new ArrayList<>(list)
) parcourt la liste, et il en est de mêmeCollections.reverse
. Nous pouvons réécrire cette méthode pour répéter une seule fois, si nous sommes si enclins:C'est plus efficace, mais aussi plus verbeux.
Alternativement, nous pouvons réécrire ce qui précède pour utiliser l'
stream
API de Java 8 , que certaines personnes trouvent plus concise et lisible que ci-dessus:nb. cela
Collectors.toList()
fait très peu de garanties sur la liste des résultats. Si vous voulez vous assurer que le résultat revient en tant que ArrayList, utilisezCollectors.toCollection(ArrayList::new)
plutôt.La troisième option consiste à créer une vue dans l'ordre inverse . Il s'agit d'une solution plus compliquée, et mérite une lecture plus approfondie / sa propre question. La méthode inverse des listes de goyaves est un point de départ viable.
Le choix d'une implémentation "la plus simple" est laissé comme un exercice pour le lecteur.
la source
Solution sans utiliser ArrayList supplémentaire ou une combinaison de méthodes add () et remove (). Les deux peuvent avoir un impact négatif si vous devez inverser une énorme liste.
la source
la source
Inverser une ArrayList de manière récursive et sans créer de nouvelle liste pour ajouter des éléments:
la source
Au cas où nous utilisons Java 8 , nous pouvons utiliser Stream. L'ArrayList est une liste d'accès aléatoire et nous pouvons obtenir un flux d'éléments dans l'ordre inverse, puis le collecter dans un nouveau
ArrayList
.L'approche ci-dessus ne convient pas à LinkedList car il ne s'agit pas d'un accès aléatoire. Nous pouvons également utiliser
instanceof
pour vérifier également.la source
Nous pouvons également faire de même avec java 8.
la source
Un peu plus lisible :)
la source
Une autre solution récursive
la source