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, votre classe peut être triée automatiquement en utilisant des méthodes comme Collections.sort() ou stockée dans des collections triées comme TreeSet.
L'interface vous oblige à implémenter une seule méthode : compareTo(). Cette méthode compare l'objet actuel avec 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 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, AlicePour comparer des chaînes de caractères ou d'autres champs Comparable, vous pouvez déléguer à leur méthode compareTo() au lieu d'utiliser la soustraction : return this.name.compareTo(other.name);. Cette approche est plus sûre et gère correctement les cas particuliers.
Défi
FacileConstruisons 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 comment se comparer à d'autres films, permettant un tri automatique de la note la plus élevée à la plus basse.
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), etrating(double, de 0.0 à 10.0). Incluez un constructeur pour initialiser tous les champs et des méthodes getter pour chacun.Faites en sorte que votre classe Movie implémente
Comparable<Movie>et remplacez la méthodecompareTo(). Les films doivent être triés par note par ordre décroissant (le mieux noté en premier). Lors de la comparaison de doubles, utilisezDouble.compare()pour une comparaison sécurisée — n'oubliez pas d'inverser l'ordre pour un tri décroissant !Remplacez
toString()pour retourner :[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 en entrée trois films, chacun sur une ligne séparée au format :title,director,ratingAnalysez chaque ligne pour créer des objets Movie, ajoutez-les à une
ArrayList, puis utilisezCollections.sort()pour trier la liste. Grâce à votre implémentation deComparable, les films s'organiseront automatiquement par note !Après le tri, affichez chaque film sur sa propre ligne en utilisant le format
toString(). Le film le mieux noté doit apparaître en premier.
Vous recevrez trois lignes d'entrée, chacune contenant des données de film au format : title,director,rating
Par exemple, une ligne d'entrée pourrait ressembler à : 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 comment 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 !
Aide-mémoire
L'interface Comparable permet aux objets de définir leur ordre naturel pour un tri automatique.
Implémentez la méthode compareTo() qui renvoie :
- Une valeur négative : cet objet vient avant l'autre
- Zéro : les deux objets sont égaux
- Une valeur positive : cet objet vient après l'autre
public class Person implements Comparable<Person> {
private int age;
@Override
public int compareTo(Person other) {
return this.age - other.age; // Trier par âge croissant
}
}Triez les objets en utilisant Collections.sort() :
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Trié par âgePour comparer des chaînes de caractères, déléguez à leur méthode compareTo() :
return this.name.compareTo(other.name);Pour comparer des doubles en toute sécurité, utilisez Double.compare() :
return Double.compare(this.rating, other.rating); // Croissant
return Double.compare(other.rating, this.rating); // DécroissantEssayez 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 une ArrayList pour stocker des objets Movie
// TODO: Analyser chaque ligne (format : title,director,rating)
// Hint: Utiliser split(",") pour séparer les parties
// Hint: Utiliser Double.parseDouble() pour le rating
// 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)
}
}
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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur