Hola Liliana,
¡Entiendo tu duda! Has captado bien las diferencias entre Comparable y Comparator. Permíteme darte un ejemplo práctico para que puedas ver cómo funcionan ambos en acción.
Supongamos que tienes una clase Persona con atributos como nombre y edad. Si deseas ordenar una lista de personas por edad, puedes hacerlo de dos maneras:
Usando Comparable: Implementas la interfaz Comparable en la clase Persona y defines el método compareTo para establecer el criterio de ordenamiento natural. Por ejemplo, podrías ordenar por edad de la siguiente manera:
public class Persona implements Comparable<Persona> {
private String nombre;
private int edad;
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
public int compareTo(Persona otraPersona) {
return Integer.compare(this.edad, otraPersona.edad);
}
}
Luego, puedes usar Collections.sort(listaDePersonas) para ordenar por edad.
Usando Comparator: Si no deseas modificar la clase Persona o quieres tener múltiples formas de ordenar, puedes crear un Comparator externo. Por ejemplo, para ordenar por nombre:
import java.util.Comparator;
public class ComparadorPorNombre implements Comparator<Persona> {
@Override
public int compare(Persona p1, Persona p2) {
return p1.getNombre().compareTo(p2.getNombre());
}
}
Y luego, usarlo así: Collections.sort(listaDePersonas, new ComparadorPorNombre()).
O también podrías usar expresiones lambda para simplificar:
Collections.sort(listaDePersonas, (p1, p2) -> p1.getNombre().compareTo(p2.getNombre()));
Espero que estos ejemplos te ayuden a entender mejor cómo y cuándo usar Comparable y Comparator. ¡Espero haber ayudado y buenos estudios!