L'astuce ici est de définir "reverse". 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, parlant intuitivement plus simple, est Collections.reverse
:
Collections.reverse(myList);
Cette méthode modifie la liste en place. C'est-à-dire, Collections.reverse
prend la liste et écrase ses éléments, ne laissant aucune copie non inversée derrière. Ceci est approprié pour certains cas d'utilisation, mais pas pour d'autres; de plus, il suppose que la liste est modifiable. Si cela est acceptable, nous sommes bons.
Dans le cas contraire, on pourrait créer une copie dans l'ordre inverse:
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
Cette approche fonctionne, mais nécessite itérer sur la liste deux fois. Le constructeur de copie (new ArrayList<>(list)
) effectue une itération sur la liste, tout comme Collections.reverse
. Nous pouvons réécrire cette méthode pour itérer une seule fois, si nous sommes tellement enclins:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
Ceci est plus efficace, mais aussi plus bavard.
Alternativement, on peut réécrire ci-dessus pour utiliser l'API Java 8 stream
, qui certaines personnes trouver plus concise et lisible que ce qui précède:
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
nb. que Collectors.toList()
fait très peu de garanties sur la liste de résultats. Si vous voulez vous assurer que le résultat revient en tant que ArrayList, utilisez plutôt Collectors.toCollection(ArrayList::new)
.
La troisième option consiste à créer une vue dans l'ordre inverse. C'est une solution plus compliquée, et digne d'une lecture plus approfondie/sa propre question. La méthode Lists#reverse de Guava 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 façon la plus simple. juste une ligne .. –
@AgarwalShankar je reçois une erreur requise ArrayList trouvé void. Est-ce que j'ai raté quelque chose? –
@SagarDevanga La liste est inversée en place, pas retourné. – Carcigenicate