Java - Comment utiliser le comparateur?

TreeSet et TreeMap stockent les éléments dans un ordre trié. Cependant, c'est le comparateur qui définit précisément ce que signifie l' ordre trié .

L'interface Comparator définit deux méthodes: compare () et equals (). La méthode compare (), illustrée ici, compare deux éléments pour l'ordre -

La méthode de comparaison

int compare(Object obj1, Object obj2)

obj1 et obj2 sont les objets à comparer. Cette méthode renvoie zéro si les objets sont égaux. Il renvoie une valeur positive si obj1 est supérieur à obj2. Sinon, une valeur négative est renvoyée.

En remplaçant compare (), vous pouvez modifier la façon dont les objets sont classés. Par exemple, pour trier dans un ordre inverse, vous pouvez créer un comparateur qui inverse le résultat d'une comparaison.

La méthode equals

La méthode equals (), illustrée ici, teste si un objet est égal au comparateur appelant -

boolean equals(Object obj)

obj est l'objet à tester pour l'égalité. La méthode renvoie true si obj et l'objet appelant sont tous deux des objets Comparator et utilisent le même ordre. Sinon, il renvoie false.

Remplacer equals () n'est pas nécessaire, et la plupart des comparateurs simples ne le feront pas.

Exemple

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() + ", ");
   }
}

Cela produira le résultat suivant -

Production

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

Note - Le tri de la classe Arrays est identique à celui des collections.