Java Comparable

DOMANDA:

Che differenza c'è in Java tra il Comparator e Comparable?


RIPOSTA:

La differenza è sottile. Il Comparator (java.util.Comparator) ci permette di confrontare due oggetti differenti, Comparable (java.lang.Comparable) invece confronta se stesso con un altro oggetto.

Entrambe le interfacce consentono di confrontare due oggetti non misurabili. Ad esempio è facile dire che 1 è minore di 10, ma che significa confrontare due Impiegati?
Potremmo intendere un paragone in termini di età anagrafica, oppure di ruolo gerarchico o ancora di stipendio.
Per definire qual è il termine di paragone dobbiamo implementare un Comparator o un Comparable.

Ieri abbiamo visto cos'è e come si usa un Comparator, per cui oggi affrontiamo lo stesso problema con la classe Comparable.


La classe Impiegato (che implementa Comparable):

package comparable;

public class Impiegato implements Comparable<Impiegato> {

   private String nome;
   private int eta;
   private double stipendio;

   public Impiegato(String nome, int eta, double stipendio){
      this.setNome(nome);
      this.setEta(eta);
      this.stipendio = stipendio;
   }

   public int compareTo(Impiegato imp) {
      return (int) (this.stipendio - imp.stipendio);
   }

   public String getNome() {
      return nome;
   }

   public void setNome(String nome) {
      this.nome = nome;
   }

   public int getEta() {
      return eta;
   }

   public void setEta(int eta) {
      this.eta = eta;
   }
}


La classe di Test:

package comparable;

public class TestImpiegato {
   public static void main(String[] args) {

      Impiegato imp1 = new Impiegato("Fabrizio", 25, 1500);
      Impiegato imp2 = new Impiegato("Francesco", 25, 2500);
      Impiegato imp3 = new Impiegato("Giuseppe", 26, 1500);

      if(imp1.compareTo(imp2) < 0)
         System.out.println(imp1.getNome() + " guadagna meno di " + imp2.getNome());

      if(imp1.compareTo(imp3) == 0)
         System.out.println(imp1.getNome() + " guadagna quanto " + imp3.getNome());

      if(imp1.compareTo(imp2) > 0)
         System.out.println(imp1.getNome() + " guadagna più di " + imp2.getNome());
   }
}


Come potete notare, mentre con il Comparator visto ieri abbiamo dovuto creare una terza classe con capacità di confronto tra due oggetti, in questo caso è la classe Impiegato stessa che sa come misurarsi rispetto ad un altra istanza.

Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java