Qual é a maneira mais simples de reverter esse 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());
java
android
arraylist
collections
Ishu
fonte
fonte
Não é a maneira mais simples, mas se você é um fã de recursão, pode estar interessado no seguinte método para reverter um ArrayList:
Ou não recursivamente:
fonte
int j
é atualizado a cada iteração? Você o inicializa,j = list.size() - 1
mas não acho que a seção de inicializaçãofor loop
seja atualizada a cada iteração, pois não?IndexOutOfBoundsException
desde que está tentando acessarj
(o último índice do ArrayList original), mas você já removeu o objeto nesse índice?add()
empurra os outros elementos para baixo na matriz, para que a matriz permaneça essencialmente com um tamanho constante. Soluções interessantes, obrigado!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
: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 :
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 aconteceCollections.reverse
. Podemos reescrever esse método para iterar apenas uma vez, se quisermos: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: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-oCollectors.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.
fonte
Solução sem usar ArrayList extra ou combinação dos métodos add () e remove (). Ambos podem ter um impacto negativo se você precisar reverter uma lista enorme.
fonte
fonte
Invertendo um ArrayList de maneira recursiva e sem criar uma nova lista para adicionar elementos:
fonte
Apenas no caso de estarmos usando o Java 8 , podemos usar o Stream. O ArrayList é uma lista de acesso aleatório e podemos obter um fluxo de elementos na ordem inversa e depois coletá-lo em um novo
ArrayList
.A abordagem acima não é adequada para o LinkedList, pois não é de acesso aleatório. Também podemos usar
instanceof
para verificar também.fonte
Também podemos fazer o mesmo usando o java 8.
fonte
Um pouco mais legível :)
fonte
Outra solução recursiva
fonte