Sobes.tech
Junior

Qual è la differenza tra Comparator e Comparable?

sobes.tech AI

Risposta dell'AI

Comparable viene utilizzato per definire l'ordine "naturale" di ordinamento di un oggetto di classe. Implementa l'interfaccia Comparable<T>, fornendo il metodo compareTo(T o).

Comparator viene utilizzato per definire uno o più ordini di ordinamento alternativi. Implementa l'interfaccia Comparator<T>, fornendo il metodo compare(T o1, T o2).

Le principali differenze sono presentate nella tabella:

Caratteristica Comparable Comparator
Interfaccia java.lang.Comparable<T> java.util.Comparator<T>
Metodo di ordinamento compareTo(T o) compare(T o1, T o2)
Utilizzo Dentro la classe dell'oggetto Classe separata o lambda
Posizione della logica Nella stessa classe In un luogo separato
Numero di ordini Solo uno "naturale" Molti alternativi
Modifica della classe Richiede modifica della classe Non richiede modifica della classe

Esempio di utilizzo di Comparable:

// Classe che implementa Comparable per ordinare per 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) {
        // Confronto per nome
        return this.name.compareTo(other.name);
    }

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

Esempio di utilizzo di Comparator:

// Comparator per ordinare per età
import java.util.Comparator;

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        // Confronto per età
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}