Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Comparacao por tempo

Pessoal, tudo bem?

Fiz uma implementacao da comparacao das aulas por tempo sobrescrevendo o compareTo utilizando o metodo estatico compare da classe Integer e dps o Collections.sort(aulas);..em termos de boas praticas e otimizacao, ficaria mais ou menos interessante do que a implementacao com o aulas.sort(Comparator.comparing(Aula::getTempo()); ?

Obs: supondo que eu tenha so 1 criterio de ordenacao, sendo este por tempo

public class Aula implements Comparable<Aula> {

// codigo...

@Override
    public int compareTo(Aula outraAula) {
        return Integer.compare(this.tempo, outraAula.getTempo());

    }
}
1 resposta
solução!

Excelente pergunta. Vamos fazer um teste? Vamos criar um array de Aulas, quanto maior melhor.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main {

    public static void main(String[] args) {

        ArrayList<Aula> aulas1 = new ArrayList<>(), aulas2 = new ArrayList<>();

        for(int i = 0; i < 1000; i++) {
            int numeroGerado = (int) ( Math.random() * 1000 );
            Aula a = new Aula(numeroGerado); 
            aulas1.add( a );
            aulas2.add( a );
        }
        // Arrays.copyOf(original, newLength), podiamos copiar um array em função do outro.
        // imprimindo os dois arrays 
        System.out.println(aulas1);
        System.out.println(aulas2);
        System.out.println();

        long comecouMillis = System.currentTimeMillis();
        Collections.sort(aulas1);
        long tempoCollectionsSort = System.currentTimeMillis() - comecouMillis;
        System.out.println("Tempo do Collections.sort(aulas) = " + tempoCollectionsSort + "ms.");

        comecouMillis = System.currentTimeMillis();
        aulas2.sort(Comparator.comparing(Aula::getTempo));
        long tempoComparatorComparing = System.currentTimeMillis() - comecouMillis;
        System.out.println("Tempo do Comparator.comparing(Aula::getTempo()) = " + tempoComparatorComparing + "ms.");

        // imprimindo os dois arrays ordenados
        System.out.println(aulas1);
        System.out.println(aulas2);
    }

}

class Aula implements Comparable<Aula> {
    private int tempo;

    public Aula(int tempo) {
        this.tempo = tempo;
    }

    public int getTempo() {
        return tempo;
    }

    public String toString() {
        return tempo + "";
    }

    @Override
    public int compareTo(Aula o) {
        return Integer.compare(this.tempo, o.getTempo());
    }
}

Execute várias vezes. Altere o número de itens do array no laço "for." Será que era previsível o resultado que obtém? Inspecione a implementação dos métodos Collection.sort e Comparator. comparing e veja quantas verificações extra são feitas em um ou outro. Quanto mais rápido um do outro é no seu computador. A mim dá uma diferença entre 5 a 10x mais rápida uma solução da outra!!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software