Menu
Coddy logo textTech

compareTo() et Comparable

Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 44 sur 87.

L’interface Comparable permet aux objets de définir leur ordre naturel. En implémentant cette interface, ta classe peut être triée automatiquement à l’aide de méthodes comme Collections.sort() ou stockée dans des collections triées comme TreeSet.

L’interface vous demande d’implémenter une seule méthode : compareTo(). Cette méthode compare l’objet actuel à un autre objet et renvoie un entier indiquant leur ordre relatif :

  • Valeur négative : cet objet vient avant l’autre
  • Zéro : les deux objets sont égaux
  • Valeur positive : cet objet vient après l’autre
public class Person implements Comparable<Person> {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);  // Trier par âge croissant
    }
}

Une fois implémenté, le tri devient simple :

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);  // Maintenant trié par âge : Bob, Alice

Pour comparer des chaînes ou d’autres champs Comparable, vous pouvez déléguer à leur méthode compareTo() au lieu d’utiliser une soustraction : return this.name.compareTo(other.name);. Cette approche est plus sûre et gère correctement les cas limites. Pour les champs int, préférez Integer.compare(a, b) à a - b, car la soustraction peut provoquer un dépassement avec des valeurs extrêmes.

challenge icon

Défi

Facile

Construisons un système de classement de films qui utilise l’interface Comparable pour trier les films selon leurs notes. Vous allez créer une classe Movie qui sait se comparer à d’autres films, permettant un tri automatique de la note la plus élevée à la plus faible.

Vous organiserez votre code sur deux fichiers :

  • Movie.java : créez une classe représentant un film qui peut être comparé à d’autres films. Un Movie possède trois champs privés : title (String), director (String) et rating (double, de 0.0 à 10.0). Ajoutez un constructeur pour initialiser tous les champs ainsi que des méthodes getter pour chacun.

    Faites implémenter à votre classe Movie Comparable<Movie> et redéfinissez la méthode compareTo(). Les films doivent être triés par note dans l’ordre décroissant (la note la plus élevée en premier). Lorsque vous comparez des nombres décimaux, utilisez Double.compare() pour une comparaison sûre : n’oubliez pas d’inverser l’ordre pour un tri décroissant !

    Redéfinissez toString() afin qu’elle renvoie : [title] by [director] - Rating: [rating]

  • Main.java : donnez vie à votre classe Movie en créant une liste de films et en les triant. Vous recevrez les données de trois films, chacun sur une ligne distincte, au format suivant : title,director,rating

    Analysez chaque ligne pour créer des objets Movie, ajoutez-les à une ArrayList, puis utilisez Collections.sort() pour trier la liste. Grâce à votre implémentation de Comparable, les films seront automatiquement classés selon leur note !

    Après le tri, affichez chaque film sur sa propre ligne en utilisant le format toString(). Le film ayant la meilleure note doit apparaître en premier.

Vous recevrez trois lignes d’entrée, chacune contenant les données d’un film au format suivant : title,director,rating

Par exemple, une ligne d’entrée peut ressembler à ceci : Inception,Christopher Nolan,8.8

N’oubliez pas d’importer java.util.ArrayList, java.util.Collections et java.util.Scanner dans votre fichier Main. Remarquez que l’implémentation de Comparable vous permet de trier vos objets personnalisés avec un seul appel de méthode : aucun comparateur supplémentaire n’est nécessaire !

Essayez vous-même

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lire trois lignes de données de films
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Créer un ArrayList pour stocker des objets Movie
        
        // TODO: Analyser chaque ligne (format : title,director,rating)
        // Astuce : Utilisez split(",") pour séparer les parties
        // Astuce : Utilisez Double.parseDouble() pour la note
        
        // TODO: Créer des objets Movie et les ajouter à la liste
        
        // TODO: Trier la liste en utilisant Collections.sort()
        
        // TODO: Afficher chaque film (un par ligne)
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Java en ligne