Java - Comment utiliser Comparator ?
Bonjour à tous, futurs magiciens de Java ! ? Aujourd'hui, nous allons entreprendre un voyage passionnant à travers le monde des Comparateurs Java. Ne vous inquiétez pas si vous êtes nouveau dans la programmation - je serai votre guide amical, et nous avancerons pas à pas. À la fin de ce tutoriel, vous serez capable de trier des objets comme un pro !
Qu'est-ce qu'un Comparator ?
Avant de plonger dedans, imaginons que vous organisez votre étagère à livres. Vous pourriez vouloir ranger vos livres par titre, auteur ou date de publication. En Java, un Comparator est comme votre bibliothécaire personnel qui sait exactement comment trier votre collection en fonction du critère que vous choisissez.
En termes techniques, un Comparator est une interface en Java qui nous permet de définir un ordre personnalisé pour les objets. Il est particulièrement utile lorsque nous voulons trier des objets qui n'ont pas d'ordre naturel, ou lorsque nous voulons les trier d'une manière différente de leur ordre naturel.
L'Interface Comparator
Jetons un coup d'œil plus détaillé à l'interface Comparator :
public interface Comparator<T> {
int compare(T o1, T o2);
}
Ne vous laissez pas intimider par cela ! C'est plus simple qu'il n'y paraît. Le <T>
indique simplement que cette interface peut fonctionner avec n'importe quel type d'objet. La méthode compare
est là où l'essentiel se passe - c'est comme demander à votre bibliothécaire de comparer deux livres.
Comment fonctionne la méthode compare
La méthode compare
prend deux objets et renvoie un entier :
- Si le premier objet est considéré comme "inférieur" au second, il renvoie un nombre négatif.
- S'ils sont considérés "égaux", il renvoie zéro.
- Si le premier est "supérieur" au second, il renvoie un nombre positif.
Pensez-y comme une balance. Si le premier objet est plus léger, la balance penche du côté négatif. Si ils sont égaux, elle reste équilibrée à zéro. Si le premier est plus lourd, elle penche du côté positif.
Créer votre premier Comparator
Créons un Comparator simple pour trier les chaînes de caractères par leur longueur. Nous l'appellerons StringLengthComparator
:
import java.util.Comparator;
public class StringLengthComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
Voici ce qui se passe :
- Nous importons l'interface Comparator de
java.util
. - Nous créons une classe qui implémente
Comparator<String>
, ce qui signifie qu'elle comparera des objets String. - Nous surchargeons la méthode
compare
pour soustraire la longueur de la deuxième chaîne de la première.
Utiliser votre Comparator
Maintenant que nous avons notre Comparator, mettons-le à l'œuvre ! Nous allons créer une liste de chaînes de caractères et les trier :
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ComparatorExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Pear");
fruits.add("Banana");
fruits.add("Kiwi");
System.out.println("Avant le tri : " + fruits);
Collections.sort(fruits, new StringLengthComparator());
System.out.println("Après le tri : " + fruits);
}
}
Sortie :
Avant le tri : [Apple, Pear, Banana, Kiwi]
Après le tri : [Pear, Kiwi, Apple, Banana]
Voici ce qui se passe :
- Nous créons une liste de noms de fruits.
- Nous affichons la liste originale.
- Nous utilisons
Collections.sort()
avec notre Comparator personnalisé pour trier la liste. - Nous affichons la liste triée.
Noticez comment les fruits sont maintenant triés par la longueur de leurs noms !
Expressions Lambda : Un raccourci
Java 8 a introduit les expressions lambda, qui peuvent rendre notre Comparator encore plus concis. Voici le même exemple en utilisant une lambda :
Collections.sort(fruits, (s1, s2) -> s1.length() - s2.length());
Cette ligne fait exactement la même chose que notre classe StringLengthComparator
! C'est comme dire à Java, "Hey, lorsque tu compares deux chaînes, soustrais simplement leurs longueurs."
Trier des objets personnalisés
Maintenant, levons le niveau et trions des objets personnalisés. Imaginons que nous avons une classe Person
:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters et setters...
@Override
public String toString() {
return name + " (" + age + ")";
}
}
Nous pouvons créer un Comparator pour trier les objets Person
par âge :
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class PersonSortExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Charlie", 22));
System.out.println("Avant le tri : " + people);
Collections.sort(people, Comparator.comparingInt(Person::getAge));
System.out.println("Après le tri : " + people);
}
}
Sortie :
Avant le tri : [Alice (25), Bob (30), Charlie (22)]
Après le tri : [Charlie (22), Alice (25), Bob (30)]
Ici, nous utilisons Comparator.comparingInt()
, qui crée un Comparator basé sur une valeur entière - dans ce cas, l'âge. La méthode Person::getAge
est une référence de méthode, indiquant à Java d'utiliser la méthode getAge()
pour obtenir la valeur à comparer.
Inverser l'ordre
Que se passe-t-il si nous voulons trier dans l'ordre décroissant ? Très simple ! Utilisez la méthode reversed()
:
Collections.sort(people, Comparator.comparingInt(Person::getAge).reversed());
Cela triera nos objets Person
de l'âge le plus élevé au plus jeune.
Chainer des Comparators
Parfois, nous pourrions vouloir trier selon plusieurs critères. Par exemple, trions les objets Person
par âge, et si les âges sont les mêmes, par nom :
Comparator<Person> ageAndNameComparator = Comparator
.comparingInt(Person::getAge)
.thenComparing(Person::getName);
Collections.sort(people, ageAndNameComparator);
Cela crée un Comparator qui trie d'abord par âge, et si les âges sont égaux, par nom.
Conclusion
Félicitations ! Vous avez maintenant appris les ficelles des Comparateurs Java. Du tri simple de chaînes de caractères aux objets complexes, vous avez le pouvoir d'organiser les données selon n'importe quel critère que vous choisissez. Souvenez-vous, la pratique rend parfait, alors n'ayez pas peur d'expérimenter avec différents critères de tri et objets.
Alors que vous continuez votre voyage dans Java, vous trouverez les Comparateurs être des outils précieux dans votre boîte à outils de programmation. Ils ne sont pas seulement utilisés pour trier des listes - ils sont utilisés dans de nombreuses collections et algorithmes Java pour maintenir l'ordre et effectuer des recherches efficaces.
Continuez à coder, continuez à apprendre, et surtout, amusez-vous ! Qui sait ? Peut-être que vous écrirez un jour un algorithme de tri qui révolutionnera la manière dont nous organisons les données. Jusque-là, bon triage ! ?????
Méthodes de l'Interface Comparator
Voici un tableau des méthodes clés de l'interface Comparator :
Méthode | Description |
---|---|
compare(T o1, T o2) |
Compare ses deux arguments pour l'ordre. |
equals(Object obj) |
Indique si un autre objet est "égal" à ce comparateur. |
reversed() |
Retourne un comparateur qui impose l'ordre inverse de ce comparateur. |
thenComparing(Comparator<? super T> other) |
Retourne un comparateur de tri lexicographique avec un autre comparateur. |
thenComparingInt(ToIntFunction<? super T> keyExtractor) |
Retourne un comparateur de tri lexicographique avec une fonction qui extrait une clé de tri entière. |
thenComparingLong(ToLongFunction<? super T> keyExtractor) |
Retourne un comparateur de tri lexicographique avec une fonction qui extrait une clé de tri longue. |
thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) |
Retourne un comparateur de tri lexicographique avec une fonction qui extrait une clé de tri double. |
Ces méthodes fournissent des outils puissants pour créer des logiques de tri complexes, vous permettant de construire des comparateurs sophistiqués pour tout type de données ou exigence de tri.
Credits: Image by storyset