Java - Come usare il comparatore?

Sia TreeSet che TreeMap memorizzano gli elementi in ordine ordinato. Tuttavia, è il comparatore che definisce esattamente il significato di ordinamento .

L'interfaccia di Comparator definisce due metodi: compare () ed equals (). Il metodo compare (), mostrato qui, confronta due elementi per ordine:

Il metodo di confronto

int compare(Object obj1, Object obj2)

obj1 e obj2 sono gli oggetti da confrontare. Questo metodo restituisce zero se gli oggetti sono uguali. Restituisce un valore positivo se obj1 è maggiore di obj2. In caso contrario, viene restituito un valore negativo.

Sovrascrivendo compare (), è possibile modificare il modo in cui gli oggetti sono ordinati. Ad esempio, per ordinare in ordine inverso, puoi creare un comparatore che inverte il risultato di un confronto.

Il metodo uguale

Il metodo equals (), mostrato qui, verifica se un oggetto è uguale al comparatore di invocazione -

boolean equals(Object obj)

obj è l'oggetto da verificare per l'uguaglianza. Il metodo restituisce true se obj e l'oggetto invocante sono entrambi oggetti Comparator e utilizzano lo stesso ordine. In caso contrario, restituisce false.

L'override di equals () non è necessario e la maggior parte dei semplici comparatori non lo farà.

Esempio

import java.util.*;

class Dog implements Comparator<Dog>, Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   // Overriding the compare method to sort the age 
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }
}

public class Example {

   public static void main(String args[]) {
      // Takes a list o Dog objects
      List<Dog> list = new ArrayList<Dog>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));
      Collections.sort(list);   // Sorts the array list

      for(Dog a: list)   // printing the sorted list of names
         System.out.print(a.getDogName() + ", ");

      // Sorts the array list using comparator
      Collections.sort(list, new Dog());
      System.out.println(" ");
      
      for(Dog a: list)   // printing the sorted list of ages
         System.out.print(a.getDogName() +"  : "+ a.getDogAge() + ", ");
   }
}

Questo produrrà il seguente risultato:

Produzione

Lacy, Roger, Shaggy, Tammy, Tommy,
Tammy  : 1, Lacy  : 2, Shaggy  : 3, Tommy  : 4, Roger  : 10,

Note - L'ordinamento della classe Arrays è uguale a quello delle collezioni.