Em Java, a interface Comparator fornece uma maneira de comparar dois objetos para determinar sua ordem. Isto é especialmente útil quando você deseja classificar coleções como listas ou matrizes em uma ordem personalizada.
Um Comparator personalizado é necessário quando a ordem natural dos objetos (conforme definido por sua implementação Comparable) não atende às suas necessidades. Por exemplo, classificar uma lista de objetos Employee por salário, nome ou idade pode exigir comparadores diferentes.
Vamos percorrer o processo de criação de um Comparador personalizado.
Considere uma classe Funcionário com os campos nome , idade e salário. Queremos classificar uma lista de objetos Funcionário por salário em ordem crescente.
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()); } }
Neste exemplo, a classe SalaryComparator implementa a interface Comparator e substitui o método compare para comparar funcionários por salário.
Agora, vamos criar uma lista de funcionários e classificá-la usando nosso Comparador.
personalizado.
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); } }
A execução do código acima produzirá a seguinte saída:
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}
A lista de funcionários agora está ordenada por salário em ordem crescente, graças ao Comparador personalizado.
Às vezes, você pode precisar de uma lógica de comparação mais complexa ou querer classificar por vários campos.
Vamos modificar nosso Comparador para classificar primeiro por salário e depois por nome em caso de empate.
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; } }
Usando o SalaryThenNameComparator , agora você pode classificar os funcionários por salário e nome:
Collections.sort(employees, new SalaryThenNameComparator());
Escrever uma função Comparadora personalizada em Java permite adaptar o comportamento de classificação de coleções para atender a necessidades específicas. Se você precisa de uma comparação simples por um único campo ou de uma classificação complexa por vários critérios, o Comparator oferece uma solução flexível e poderosa.
Se você tiver alguma dúvida ou precisar de mais esclarecimentos, fique à vontade para deixar um comentário abaixo!
Leia mais postagens em: Como escrever uma função de comparação personalizada em Java?
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3