Java Language Tri naturel (comparable) vs explicite (comparateur)


Exemple

Il existe deux méthodes Collections.sort() :

  • Celui qui prend List<T> comme paramètre où T doit implémenter Comparable et remplacer la méthode compareTo() qui détermine l'ordre de tri.
  • L'un qui prend les listes et les comparateurs comme arguments, où le comparateur détermine l'ordre de tri.

Tout d'abord, voici une classe Person qui implémente Comparable:

public class Person implements Comparable<Person> {         
    private String name;  
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }         

    @Override
    public int compareTo(Person o) {
        return this.getAge() - o.getAge();
    }
    @Override
    public String toString() {
        return this.getAge()+"-"+this.getName();
    }

}

Voici comment utiliser la classe ci-dessus pour trier une liste dans l'ordre naturel de ses éléments, définie par la méthode compareTo() :

//-- usage
List<Person> pList = new ArrayList<Person>();
            Person p = new Person();
            p.setName("A");
            p.setAge(10);
            pList.add(p);
            p = new Person();
            p.setName("Z");
            p.setAge(20);
            pList.add(p);
            p = new Person();
            p.setName("D");
            p.setAge(30);
            pList.add(p);
            
            //-- natural sorting i.e comes with object implementation, by age
            Collections.sort(pList);

            System.out.println(pList);

Voici comment vous utiliseriez un comparateur en ligne anonyme pour trier une liste qui n’implémente pas Comparable ou, dans ce cas, pour trier une liste dans un ordre autre que le classement naturel:

            //-- explicit sorting, define sort on another property here goes with name
            Collections.sort(pList, new Comparator<Person>() {

                @Override
                public int compare(Person o1, Person o2) {
                    return o1.getName().compareTo(o2.getName());
                }
            });            
            System.out.println(pList);