O truque aqui é definir "reverso". É possível modificar a lista no local, criar uma cópia na ordem inversa ou criar uma exibição na ordem inversa.
A maneira mais simples, intuitivamente falando , é Collections.reverse
:
Collections.reverse(myList);
Este método modifica a lista no local . Ou seja, Collections.reverse
pega a lista e sobrescreve seus elementos, deixando para trás nenhuma cópia irreversível. Isso é adequado para alguns casos de uso, mas não para outros; além disso, assume que a lista é modificável. Se isso é aceitável, estamos bem.
Caso contrário, pode-se criar uma cópia na ordem inversa :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
Essa abordagem funciona, mas requer a repetição da lista duas vezes. O construtor copy ( new ArrayList<>(list)
) itera sobre a lista, e o mesmo acontece Collections.reverse
. Podemos reescrever esse método para iterar apenas uma vez, se quisermos:
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;
}
Isso é mais eficiente, mas também mais detalhado.
Como alternativa, podemos reescrever o item acima para usar a stream
API do Java 8 , que algumas pessoas consideram mais concisa e legível que a anterior:
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. isso Collectors.toList()
faz muito poucas garantias sobre a lista de resultados. Se você deseja garantir que o resultado volte como um ArrayList, use-o Collectors.toCollection(ArrayList::new)
.
A terceira opção é criar uma visão em ordem inversa . Essa é uma solução mais complicada e digna de mais leituras / sua própria pergunta. O método de inversão de listas da Goiaba é um ponto de partida viável.
A escolha de uma implementação "mais simples" é deixada como um exercício para o leitor.