Java - como usar o comparador?

Tanto TreeSet quanto TreeMap armazenam elementos em ordem de classificação. No entanto, é o comparador que define precisamente o que significa ordem de classificação .

A interface Comparator define dois métodos: compare () e equals (). O método compare (), mostrado aqui, compara dois elementos para o pedido -

O método de comparação

int compare(Object obj1, Object obj2)

obj1 e obj2 são os objetos a serem comparados. Este método retorna zero se os objetos forem iguais. Ele retorna um valor positivo se obj1 for maior que obj2. Caso contrário, um valor negativo é retornado.

Substituindo compare (), você pode alterar a maneira como os objetos são ordenados. Por exemplo, para classificar em ordem inversa, você pode criar um comparador que inverte o resultado de uma comparação.

O Método de Igualdade

O método equals (), mostrado aqui, testa se um objeto é igual ao comparador de chamada -

boolean equals(Object obj)

obj é o objeto a ser testado quanto à igualdade. O método retorna true se obj e o objeto de chamada forem ambos objetos Comparator e usarem a mesma ordem. Caso contrário, retorna falso.

Substituir equals () é desnecessário e a maioria dos comparadores simples não o fará.

Exemplo

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

Isso produzirá o seguinte resultado -

Resultado

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

Note - A classificação da classe Arrays é igual à das Coleções.