26 de noviembre de 2020

Interface Comparable

En la entrada anterior hemos ordenado una lista con elementos que tenían un orden natural, pero si lo intentamos hacer con una lista de vehículos no vamos a poder ordenarlos. Para poder ordenar una lista sus elementos deben implementar la interface Comparable.

NOTA: Si lo intentamos sin implementar la interface nos saldrá la excepción java.lang.ClassCastException: class Vehiculo cannot be cast to class java.lang.Comparable que deja bien claro cuál es el problema.

Se declara como cualquier otra interface, pero en este caso necesitamos poner un tipo genérico para indicar qué tipo puede ordenar la implementación. El código queda así:

public class Vehiculo implements Comparable<Vehiculo> {

  ...
  //  Nos hacemos un getter porque lo usamos dos veces
  private String getModelo() {
    return modelo;
  }

  @Override
  public String toString() {
    return getModelo() + " (" + getColor() + ")";
  }

  @Override
  public int compareTo(Vehiculo vehiculo) {
    return getModelo().compareTo(vehiculo.getModelo());
  }

}

Con este código ya se van a poder comparar todos los vehículos por orden alfabético de su modelo. Lo probamos con el siguiente código:

List<Vehiculo> vehiculos = Arrays.asList(
    new Coche("Gris", "Volvo"),
    new Vehiculo("Triciclo", "Rosa"),
    new Moto("Aprilla", "Azul")
  );

vehiculos.forEach(System.out::println);
vehiculos.sort(null);

System.out.println("\nLista ordenada (por modelo):");
vehiculos.forEach(System.out::println);

¿Qué significa el null en el parámetro del tipo Comparator?

Como estamos ordenando por el orden natural no le estamos pasando ningún parámetro al método sort. En realidad es como pasarle el comparador de orden natural: Comparator.naturalOrder()

En la siguiente entrada vamos a utilizar este parámetro para ordenar por color (incluso aunque ya tenga implementada la interface Comparable) y a ver las diferencias entre las interfaces Comparable y Comparator.

Compárteme

Entradas populares