Ordinare con Comparable – Lezione 17 di Java Avanzato

Come ordinare degli oggetti con compareTo di Comparable?

Comparable rappresenta l’interfaccia standard per definire un criterio di ordinamento in Java. Presente nella libreria standard java.util, Comparable consente di ordinare gli oggetti di una classe. In particolare con l’implementazione del metodo compareTo:

  public interface Comparable {
    public int compareTo(Object x);
  }

Il metodo compareTo che consente di effettuare l’ordinamento, accetta un argomento di tipo Object e restituisce un intero. Il suo contratto è:

  1. Precondizione: l’oggetto x è confrontabile con this;
  2. Postcondizione:
    • restituisce un valore negativo se this < x;
    • restituisce zero se this = x;
    • restituisce un valore positivo se this > x;
  3. Errori: lancia ClassCastException (non verificata) se x non è confrontabile con this.

L’interfaccia Comparable rappresenta il metodo standard in Java per definire un ordine tra oggetti. In particolare, le classi che vogliono confrontare oggetti implementeranno quest’interfaccia e definiranno il significano di this < x, this = x e this > x in base all’ordinamento voluto.

Facciamo un esempio: consideriamo la classe Employee, con campi nome (String) e salario (int). Vogliamo che gli Employee vengano confrontati sempre alfabeticamente per nome, allora faremo implmentare ad Employee l’interfaccia Comparable:

  public class Employee implements Comparable {
    private int salary;
    private String name;

    public int compareTo(Object x) {

      if(x == null) throw new NullPointerException();

      if(!(x instanceof Employee)) throw new ClassCastException();

        Employee e = (Employee) x;

      return name.compareTo(e.name);
    }

    //...
  }

Come si può notare, la classe Employee implementa l’interfaccia Comparable ed è costretta ad implementare il metodo compareTo. In questo caso, dato che la classe String implementa a sua volta Comparable, ne approfittiamo usando la versione comprareTo di String.

 

L’ordinamento nelle classe String

Le stringhe sono dotate di un ordinamento naturale, si tratta dell’ordinamento alfabetico (o lessicografico). Quest’ordinamento viene fornito attraverso l’implementazione di Comparable ed è case-senstive, ovvero il metodo di confronto di compareTo è basato sulle tabelle di codifica ASCII in cui c’è differenza tra lettere maiuscole e minuscole.

Una classe implementa Comparable quando possiede un unico criterio di ordinamento, in questo caso di parla di ordinamento naturale. Se una classe ha possiede più criteri di ordinamento implementerà non implementerà Comparable, ma utilizzerà l’interfaccia Comparator.

La versione di Comparable proposta è stata valida fino alla versione 1.4 di Java, a partire dalla versione 1.5 è diventata parametrica (ne parleremo nella lezione 23). Un ottimo riferimento per l’interfaccia Comprable è la documentazione ufficiale di Java.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Guide, Java, Programmazione Taggato con: , , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*