【发布时间】:2016-09-15 19:32:03
【问题描述】:
我有一个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
谁能帮我解决这个问题?
【问题讨论】:
-
你得到了什么输出?
-
得到这样的输出 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
-
不确定这是否是整个问题,但调用
EmployeeChainedComparator的构造函数只会传递EmployeeJobTitleComparator。尝试添加EmployeeNameComparator,使其包含在列表中。 -
@AndrewS 我刚刚通过传递 NameConstructor 更新了我的问题
标签: java java-8 comparator