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
:
Collections.reverse(myList);
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 :
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 une itération sur la liste deux fois. Le constructeur de copie ( new ArrayList<>(list)
) parcourt la liste, et il en est de même Collections.reverse
. Nous pouvons réécrire cette méthode pour répéter une seule fois, si nous sommes si 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;
}
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:
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. 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, utilisez Collectors.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.