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, AlicePour 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.
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 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) etrating(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éthodecompareTo(). 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, utilisezDouble.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,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 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)
}
}
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érateurEntraînez-vous par vous-même : Compilateur Java en ligne