我有一个Employee
对象,其中包含两个字段name
和jobTitle
。对于员工对象进行排序,如果jobTitle
为空,那么优先级应该是jobTitle
,然后排序应该基于名称。基于对象的不同可空字段的比较器
下面是Employee对象
public class Employee {
private String name;
private String jobTitle;
}
我用链比较与JobTitlecomparator
和NameComparator
来实现这一目标:
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());
}
}
}
现在,我应该得到的输出这样
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
但我没有达到预期的效果。我得到这样的输出
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
任何人都可以帮助我如何做到这一点?
你得到了什么输出? – Eran
获取输出像这样的员工招聘开发员工姓名汤姆 员工招聘空员工姓名山姆 员工招聘设计师员工姓名添 员工招聘空员工姓名鲍勃 员工招聘空员工姓名彼得 员工招聘程序员雇员姓名克雷格 – Digital
不知道如果这是整个问题,但调用“EmployeeChainedComparator”的构造函数只传递'EmployeeJobTitleComparator'。尝试添加'EmployeeNameComparator',以便它包含在列表中。 –