En Java, l'interface Comparator permet de comparer deux objets pour déterminer leur ordre. Ceci est particulièrement utile lorsque vous souhaitez trier des collections telles que des listes ou des tableaux dans un ordre personnalisé.
Un Comparator personnalisé est nécessaire lorsque l'ordre naturel des objets (tel que défini par leur implémentation Comparable) ne répond pas à vos besoins. Par exemple, le tri d'une liste d'objets Employé par salaire, nom ou âge peut nécessiter différents comparateurs.
Parcourons le processus de création d'un Comparateur.
Considérons une classe Employé avec les champs nom , âge et salary. Nous souhaitons trier une liste d’objets Employé par salaire par ordre croissant.
import java.util.Comparator; class Employee { private String name; private int age; private double salary; // Constructor, getters, and setters public Employee(String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } public double getSalary() { return salary; } @Override public String toString() { return "Employee{" "name='" name ''' ", age=" age ", salary=" salary '}'; } } class SalaryComparator implements Comparator{ @Override public int compare(Employee e1, Employee e2) { return Double.compare(e1.getSalary(), e2.getSalary()); } }
Dans cet exemple, la classe SalaryComparator implémente l'interface Comparator et remplace la méthode de comparaison pour comparer les employés en fonction de leur salaire.
Maintenant, créons une liste d'employés et trions-la à l'aide de notre Comparateur.
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { Listemployees = new ArrayList(); employees.add(new Employee("John", 28, 50000)); employees.add(new Employee("Anna", 32, 75000)); employees.add(new Employee("Mike", 25, 45000)); System.out.println("Before Sorting:"); employees.forEach(System.out::println); // Sort employees by salary Collections.sort(employees, new SalaryComparator()); System.out.println(" After Sorting by Salary:"); employees.forEach(System.out::println); } }
L'exécution du code ci-dessus produira le résultat suivant :
Before Sorting: Employee{name='John', age=28, salary=50000.0} Employee{name='Anna', age=32, salary=75000.0} Employee{name='Mike', age=25, salary=45000.0} After Sorting by Salary: Employee{name='Mike', age=25, salary=45000.0} Employee{name='John', age=28, salary=50000.0} Employee{name='Anna', age=32, salary=75000.0}
La liste des salariés est désormais triée par leur salaire par ordre croissant, grâce au Comparateur personnalisé.
Parfois, vous aurez peut-être besoin d'une logique de comparaison plus complexe ou souhaiterez trier selon plusieurs champs.
Modifions notre Comparateur pour trier d'abord par salaire, puis par nom en cas d'égalité.
class SalaryThenNameComparator implements Comparator{ @Override public int compare(Employee e1, Employee e2) { int salaryCompare = Double.compare(e1.getSalary(), e2.getSalary()); if (salaryCompare == 0) { return e1.getName().compareTo(e2.getName()); } return salaryCompare; } }
À l'aide de SalaryThenNameComparator , vous pouvez désormais trier les employés par salaire et par nom :
Collections.sort(employees, new SalaryThenNameComparator());
L'écriture d'une fonction Comparator personnalisée en Java vous permet d'adapter le comportement de tri des collections pour répondre à des besoins spécifiques. Que vous ayez besoin d'une simple comparaison par un seul champ ou d'un tri complexe par plusieurs critères, Comparator offre une solution flexible et puissante.
Si vous avez des questions ou avez besoin de précisions supplémentaires, n'hésitez pas à laisser un commentaire ci-dessous !
Lisez les articles plus sur : Comment écrire une fonction de comparaison personnalisée en Java ?
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3