Il trucco qui sta definendo "reverse". È possibile modificare l'elenco in posizione, creare una copia in ordine inverso o creare una vista in ordine inverso.
Il modo più semplice, intuitivamente parlando , è Collections.reverse
:
Collections.reverse(myList);
Questo metodo modifica l'elenco in atto . Cioè, Collections.reverse
prende l'elenco e sovrascrive i suoi elementi, senza lasciare alcuna copia senza risposta. Questo è adatto per alcuni casi d'uso, ma non per altri; inoltre, presuppone che l'elenco sia modificabile. Se questo è accettabile, stiamo bene.
In caso contrario, si potrebbe creare una copia in ordine inverso :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
Questo approccio funziona, ma richiede di ripetere due volte l'elenco. Il costruttore di copia ( new ArrayList<>(list)
) scorre sull'elenco e così fa Collections.reverse
. Possiamo riscrivere questo metodo per iterare solo una volta, se siamo così propensi:
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;
}
Questo è più efficiente, ma anche più dettagliato.
In alternativa, possiamo riscrivere quanto sopra per utilizzare l' stream
API di Java 8 , che alcune persone trovano più concisa e leggibile di quanto sopra:
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. che Collectors.toList()
offre pochissime garanzie sull'elenco dei risultati. Se vuoi assicurarti che il risultato ritorni come ArrayList, usa Collectors.toCollection(ArrayList::new)
invece.
La terza opzione è quella di creare una vista in ordine inverso . Questa è una soluzione più complicata e degna di ulteriori letture / la propria domanda. Liste di Guava # retro metodo è un valido punto di partenza.
La scelta di un'implementazione "più semplice" viene lasciata come esercizio per il lettore.