Sobes.tech
Junior

Qual é a diferença entre Comparator e Comparable?

sobes.tech IA

Resposta da IA

Comparable é utilizado para definir a ordem "natural" de ordenação de um objeto de classe. Implementa a interface Comparable<T>, fornecendo o método compareTo(T o).

Comparator é utilizado para definir uma ou várias ordens de ordenação alternativas. Implementa a interface Comparator<T>, fornecendo o método compare(T o1, T o2).

As principais diferenças estão apresentadas na tabela:

Característica Comparable Comparator
Interface java.lang.Comparable<T> java.util.Comparator<T>
Método de ordenação compareTo(T o) compare(T o1, T o2)
Utilização Dentro da classe do objeto Classe separada ou lambda
Localização da lógica Na própria classe Em um local separado
Número de ordens Apenas uma "natural" Múltiplas alternativas
Alteração na classe Requer alteração na classe Não requer alteração na classe

Exemplo de uso de Comparable:

// Classe que implementa Comparable para ordenar por nome
class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(Person other) {
        // Comparação por nome
        return this.name.compareTo(other.name);
    }

    @Override
    public String toString() {
        return "Person{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
    }
}

Exemplo de uso de Comparator:

// Comparator para ordenar por idade
import java.util.Comparator;

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        // Comparação por idade
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}