Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida ArrayList

Galera,

Por gentileza vocês poderiam me ajudar com o seguinte questionamento? Eu estou ordenando uma ArrayList com o compareTo e utilizei o seguinte código para fazer isso.

Porém eu gostaria de saber como acontece esse ordenamento por debaixo dos panos...

    @Override
    public int compare(String o1, String o2) {
        System.out.println(" String 1: " + o1 + " String 2: " + o2);
        System.out.println(o1.compareToIgnoreCase(o2));
        return o1.compareToIgnoreCase(o2);        
    }

Na primeira comparação o java vai comparar o verde com o marrom? Mas porque a String o1 não é o marrom e o2 é o verde, como resultado da primeira comparação ele vai retornar 9, que acredito que seja a diferença entre a letra M e o V, a partir disso ele continua comparando na sequencia? 1 com 2, depois 1 com 3, depois 1 com 4? Gostaria de saber melhor esse funcionamento interno, alguém poderia me ajudar a entender isso melhor?

Código completo da minha implementação.

package aulacarnaval4;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Principal {

    public static void main(String[] args) {

        List<String> listaCores = new ArrayList<String>();
        listaCores.add("Marrom");
        listaCores.add("Verde");
        listaCores.add("Amarelo");
        listaCores.add("Roxo");
        listaCores.add("Cinza");
        listaCores.add("Bege");
        listaCores.add("Branco");
        listaCores.add("Lilás");
        System.out.println(listaCores);
        OrdenarCoresComparator comparator = new OrdenarCoresComparator();
        listaCores.sort(comparator);
        System.out.println(listaCores);
    }
}

class OrdenarCoresComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        System.out.println(" String 1: " + o1 + " String 2: " + o2);
        System.out.println(o1.compareToIgnoreCase(o2));
        return o1.compareToIgnoreCase(o2);        
    }
}

Desde já, agradeço a ajuda!

2 respostas
solução!

Oi, Felipe. Tudo bem?

De acordo com a documentação do método, ele utiliza o algoritmo de ordenação Timsort, que seria um hibrido do Insertion sort e do Merge sort.

No passo-a-passo:

1. ele pega o array e divide ele em sub-vetores;

2. cada sub-vetor é ordenado através de um Insertion sort

3. depois de ordenados, eles são mesclados usando o Merge sort

De uma maneira bem simplificada, o algoritmo faz basicamente o mesmo que o merge sort do passo 3, porém com algumas adaptações que aumentam sua performance na hora de ordenar o vetor.

É um assunto um pouco complexo, mas caso você queira se aprofundar no assunto, temos aqui na plataforma cursos que podem te ajudar, sendo que tudo o que você precisa para começar é um pouco de java:

Algoritmos I: Selection, Insertion e Introdução a Análise

Algoritmos II: MergeSort, QuickSort, Busca Binária e Análise de Algoritmo

Estrutura de Dados: Computação na prática com Java

Caso esteja na dúvida em relação a se aprofundar ou não em algoritmos e estruturas de dados, tem um episódio muito bacana do Hipsters Ponto Tech que debate o assunto e que com certeza vai te ajudar a tomar a decisão de investir ou não o seu tempo.

Espero ter ajudado. Se ficou qualquer dúvida estamos à disposição!

Bons estudos!

Excelente Resposta Thiago.

Sua explicação me ajudou a entender bastante coisa.