Java - Comment utiliser l'interface Comparable ?

Bienvenue, aspirants programmeurs Java ! Aujourd'hui, nous allons plonger dans le monde fascinant de l'interface Comparable. Ne vous inquiétez pas si vous êtes nouveau dans la programmation - je vais vous guider pas à pas à travers ce concept, comme j'ai fait pour des centaines d'étudiants au cours de mes années d'enseignement. Alors, prenez une tasse de votre boisson favorite et partons ensemble pour cette aventure passionnante !

Java - Comparable Interface in Java

Qu'est-ce que l'interface Comparable ?

Imaginez que vous organisez votre bibliothèque. Vous pourriez vouloir ranger vos livres par titre, auteur ou date de publication. Dans le monde Java, l'interface Comparable est comme votre bibliothécaire personnel, vous aidant à trier les objets dans un ordre spécifique.

L'interface Comparable fait partie du paquet java.lang, ce qui signifie qu'elle est automatiquement disponible dans tous les programmes Java. Elle contient uniquement un méthode :

public interface Comparable<T> {
public int compareTo(T o);
}

Ne vous laissez pas intimider par cela ! Nous allons le décomposer morceau par morceau.

Comprendre la méthode compareTo()

La méthode compareTo() est le cœur de l'interface Comparable. Elle compare l'objet actuel avec un autre objet et renvoie une valeur entière :

  • Si le résultat est négatif, l'objet actuel est considéré comme "inférieur" à l'autre objet.
  • Si le résultat est positif, l'objet actuel est considéré comme "supérieur" à l'autre objet.
  • Si le résultat est zéro, les objets sont considérés comme égaux.

Voyons cela en action avec un exemple simple :

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

public Student(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public int compareTo(Student otherStudent) {
return this.age - otherStudent.age;
}

// Getters, setters, et méthode toString()
}

Dans cet exemple, nous comparons les étudiants en fonction de leur âge. Si nous soustrayons l'âge de l'autre étudiant de l'âge de l'étudiant actuel, nous obtenons :

  • Un nombre négatif si l'étudiant actuel est plus jeune
  • Un nombre positif si l'étudiant actuel est plus âgé
  • Zéro s'ils ont le même âge

Implémenter Comparable dans des objets personnalisés

Maintenant que nous comprenons les bases, créons un exemple plus complexe. Nous allons créer une classe Book et trier les livres par année de publication.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Book implements Comparable<Book> {
private String title;
private String author;
private int publicationYear;

public Book(String title, String author, int publicationYear) {
this.title = title;
this.author = author;
this.publicationYear = publicationYear;
}

@Override
public int compareTo(Book otherBook) {
return this.publicationYear - otherBook.publicationYear;
}

@Override
public String toString() {
return title + " par " + author + " (" + publicationYear + ")";
}

public static void main(String[] args) {
List<Book> bookshelf = new ArrayList<>();
bookshelf.add(new Book("1984", "George Orwell", 1949));
bookshelf.add(new Book("To Kill a Mockingbird", "Harper Lee", 1960));
bookshelf.add(new Book("Gatsby le Magnifique", "F. Scott Fitzgerald", 1925));

System.out.println("Avant le tri : " + bookshelf);
Collections.sort(bookshelf);
System.out.println("Après le tri : " + bookshelf);
}
}

Lorsque vous exécutez ce programme, vous verrez :

Avant le tri : [1984 par George Orwell (1949), To Kill a Mockingbird par Harper Lee (1960), Gatsby le Magnifique par F. Scott Fitzgerald (1925)]
Après le tri : [Gatsby le Magnifique par F. Scott Fitzgerald (1925), 1984 par George Orwell (1949), To Kill a Mockingbird par Harper Lee (1960)]

C'est génial, non ? Avec quelques lignes de code seulement, nous avons créé un mécanisme de tri personnalisé pour nos livres !

Trier dans l'ordre inverse

Mais que faire si nous voulons trier nos livres du plus récent au plus ancien ? Ne vous inquiétez pas ! Java fournit une méthode pratique Collections.reverseOrder() pour justement cet usage.

Modifions notre méthode principale :

public static void main(String[] args) {
List<Book> bookshelf = new ArrayList<>();
bookshelf.add(new Book("1984", "George Orwell", 1949));
bookshelf.add(new Book("To Kill a Mockingbird", "Harper Lee", 1960));
bookshelf.add(new Book("Gatsby le Magnifique", "F. Scott Fitzgerald", 1925));

System.out.println("Avant le tri : " + bookshelf);
Collections.sort(bookshelf);
System.out.println("Après le tri (du plus ancien au plus récent) : " + bookshelf);
Collections.sort(bookshelf, Collections.reverseOrder());
System.out.println("Après le tri (du plus récent au plus ancien) : " + bookshelf);
}

Maintenant, lorsque vous exécutez le programme, vous verrez :

Avant le tri : [1984 par George Orwell (1949), To Kill a Mockingbird par Harper Lee (1960), Gatsby le Magnifique par F. Scott Fitzgerald (1925)]
Après le tri (du plus ancien au plus récent) : [Gatsby le Magnifique par F. Scott Fitzgerald (1925), 1984 par George Orwell (1949), To Kill a Mockingbird par Harper Lee (1960)]
Après le tri (du plus récent au plus ancien) : [To Kill a Mockingbird par Harper Lee (1960), 1984 par George Orwell (1949), Gatsby le Magnifique par F. Scott Fitzgerald (1925)]

Conclusion

Et voilà ! Vous avez maintenant appris à utiliser l'interface Comparable pour trier des objets personnalisés en Java. Souvenez-vous, la clé pour maîtriser la programmation est la pratique. Essayez de créer vos propres classes et implémentez Comparable de différentes manières. Peut-être trier une liste de films par leurs notes, ou une liste de recettes par le nombre d'ingrédients.

Comme je le dis toujours à mes étudiants, la programmation est comme la cuisine - vous pourriez faire un peu de pagaille au début, mais avec de la pratique, vous serez bientôt à créer des œuvres d'art. Continuez à coder, continuez à apprendre, et surtout, amusez-vous !

Voici un tableau de réference rapide des méthodes que nous avons utilisées :

Méthode Description
compareTo(T o) Compare cet objet avec l'objet spécifié pour l'ordre
Collections.sort(List<T> list) Trie la liste spécifiée en ordre ascendant
Collections.sort(List<T> list, Comparator<? super T> c) Trie la liste spécifiée selon l'ordre induit par le Comparator spécifié
Collections.reverseOrder() Retourne un comparator qui impose l'ordre inverse sur une collection d'objets

Bonne programmation !

Credits: Image by storyset