Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Dúvida] Por que não é nessessário atribuir à variável o resultado do Collections.sort?

No vídeo 2 da aula 4, os instrutores usaram o método sort da classe Collections para ordenar a lista buscaPorArtistas. A minha dúvida é se e como que esse método atribui automatimanete o resultado do sort à própria variável que foi passada como argumento. Além disso, como faço para ordenar uma lista sem sobrescrever a lista original? Por exemplo: supondo que eu tenha uma lista a = [1, 3, 2] e queira imprimir a lista ordenada consevando a ordem original da lista no programa?

1 resposta

Oi, Izabela. Tudo bem?

A dúvida sobre a falta de uma atribuição direta (como lista = Collections.sort(lista)) ocorre porque o método Collections.sort() altera a lista diretamente na memória.

Em Java, os objetos são passados por referência. Quando uma lista é enviada como argumento para o método Collections.sort(), o método acessa o endereço de memória original daquela lista e reorganiza os seus elementos internamente. Esse tipo de operação é conhecido como ordenação in-place (no próprio local).

Como o método modifica a própria estrutura que foi passada, o seu tipo de retorno é void. Tentar atribuir o resultado a uma variável geraria um erro de compilação.

Caso o objetivo seja manter a ordem inicial dos elementos para uso posterior, existem duas estratégias principais para realizar a ordenação em uma nova estrutura.

1. Criando uma cópia da lista (Abordagem tradicional)

Antes de aplicar a ordenação, cria-se uma nova instância de lista copiando os dados da primeira. Dessa forma, as alterações acontecem apenas na cópia.

// Lista original intacta
List<Integer> listaOriginal = new ArrayList<>(List.of(1, 3, 2));

// Criando uma cópia para ordenar
List<Integer> listaOrdenada = new ArrayList<>(listaOriginal);
Collections.sort(listaOrdenada);

System.out.println("Original: " + listaOriginal); // Saída: [1, 3, 2]
System.out.println("Ordenada: " + listaOrdenada); // Saída: [1, 2, 3]

2. Utilizando a Stream API (Abordagem Funcional)

A partir do Java 8, a Stream API oferece uma maneira mais direta de gerar uma nova lista ordenada sem mexer na estrutura de origem, utilizando o método sorted().

List<Integer> listaOriginal = List.of(1, 3, 2);

// o método sorted() gera uma nova sequência ordenada
List<Integer> listaOrdenada = listaOriginal.stream()
                                           .sorted()
                                           .toList();

System.out.println("Original: " + listaOriginal); // Saída: [1, 3, 2]
System.out.println("Ordenada: " + listaOrdenada); // Saída: [1, 2, 3]

Nota importante: O uso de List.of() cria listas imutáveis. Tentar usar Collections.sort() diretamente em uma lista criada por List.of() resultará em uma exceção UnsupportedOperationException. Nesses cenários, a abordagem com Streams ou a criação de um new ArrayList<>() é obrigatória.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!