J'ai un objet Employee
qui contient deux champs name
et jobTitle
. Pour trier les objets employés, la première priorité devrait être jobTitle
, si jobTitle
est nulle alors le tri doit être basé sur le nom.Comparateur basé sur différents champs NULL d'un objet
Ci-dessous est l'objet employé
public class Employee {
private String name;
private String jobTitle;
}
J'ai utilisé enchaînée Comparator avec JobTitlecomparator
et NameComparator
pour y parvenir:
public class EmployeeChainedComparator implements Comparator<Employee> {
private List<Comparator<Employee>> listComparators;
@SafeVarargs
public EmployeeChainedComparator(Comparator<Employee>... comparators) {
this.listComparators = Arrays.asList(comparators);
}
@Override
public int compare(Employee emp1, Employee emp2) {
for (Comparator<Employee> comparator : listComparators) {
int result = comparator.compare(emp1, emp2);
if (result != 0) {
return result;
}
}
return 0;
}
}
public class EmployeeJobTitleComparator implements Comparator<Employee> {
@Override
public int compare(Employee emp1, Employee emp2) {
if(emp1.getJobTitle() != null && emp2.getJobTitle() != null){
return emp1.getJobTitle().compareTo(emp2.getJobTitle());
} else {
return 0;
}
}
}
public class EmployeeNameComparator implements Comparator<Employee> {
@Override
public int compare(Employee emp1, Employee emp2) {
return emp1.getName().compareTo(emp2.getName());
}
}
public class SortingMultipleAttributesExample {
public static void main(String[] args) {
List<Employee> listEmployees = new ArrayList<Employee>();
listEmployees.add(new Employee("Tom", "Developer"));
listEmployees.add(new Employee("Sam", null));
listEmployees.add(new Employee("Tim", "Designer"));
listEmployees.add(new Employee("Bob", null));
listEmployees.add(new Employee("Peter", null));
listEmployees.add(new Employee("Craig", "Programmer"));
Collections.sort(listEmployees, new EmployeeChainedComparator(new EmployeeJobTitleComparator(), new EmployeeNameComparator()
));
for(Employee emp : listEmployees){
System.out.println("Employee Job: "+emp.getJobTitle()+" Employee Name: "+emp.getName());
}
}
}
Maintenant, je devrais obtenir la sortie comme celui-ci
Employee Job: Designer Employee Name: Tim
Employee Job: Developer Employee Name: Tom
Employee Job: Programmer Employee Name: Craig
Employee Job: null Employee Name: Bob
Employee Job: null Employee Name: Peter
Employee Job null Employee Name: Sam
Mais je n'obtiens pas le résultat escompté comme je m'y attendais. Je reçois la sortie comme ceci
Employee Job Developer Employee Name Tom
Employee Job null Employee Name Sam
Employee Job Designer Employee Name Tim
Employee Job null Employee Name Bob
Employee Job null Employee Name Peter
Employee Job Programmer Employee Name Craig
Quelqu'un peut-il m'aider sur la façon d'y parvenir?
Quel résultat avez-vous obtenu? – Eran
Obtenir la sortie comme ce nom d'emploi employé développeur employé Tom null Nom employé Profession employé Sam Employé Job Designer Nom de l'employé Tim null employé du poste Nom de l'employé Bob null Nom de l'employé employé du poste Peter employé Nom du poste programmeur employé Craig – Digital
Je ne sais pas si c'est tout le problème, mais appeler le constructeur de 'EmployeeChainedComparator' ne fait que passer' EmployeeJobTitleComparator'. Essayez d'ajouter 'EmployeeNameComparator' afin qu'il soit inclus dans la liste. –