我正在尝试根据Age(简化示例)对Employees进行排序,但我无法让我的单元测试工作。
public class Employee{
private int age;
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
我的比较器如下所示:
class AgeComparator implements Comparator<Employee>{
public int compare(Employee emp1, Employee emp2){
int emp1Age = emp1.getAge();
int emp2Age = emp2.getAge();
if(emp1Age > emp2Age)
return 1;
else if(emp1Age < emp2Age)
return -1;
else
return 0;
}
}
我的单元测试:
public class AgeComparatorTest {
@Test
public void testAge(){
Employee e1 = new Employee();
e1.setAge(4);
Employee e2 = new Employee();
e2.setAge(7);
List<Employee> employeeList = new ArrayList<Employee>();
employeeList.add(e1);
employeeList.add(e2);
Collections.sort(employeeList, new AgeComparator());
Employee actual = employeeList.get(0);
Assert.assertEquals(e2.getAge(), actual.getAge());
}
}
我期待7岁的员工在4岁之前,但我得到了。
junit.framework.AssertionFailedError:expected:&lt; 7&gt;但是:&lt; 4&gt;
答案 0 :(得分:3)
您按升序对它们进行排序,因此这正是您的代码的预期行为。
请注意,您可以像这样简化Comparator
以获得所需的行为,您不必完全返回-1/1
,任何正面或负面int
都可以。<登记/>
的 [编辑] 强>
正如@JBNizet在评论中指出的那样,简单地在比较器中返回emp2.getAge() - emp1.getAge()
可能会溢出大值。例如,使用Guava
Ints.compare()
方法更好:
class AgeComparator implements Comparator<Employee>{
public int compare(Employee emp1, Employee emp2){
return Ints.compare(emp2.getAge(), emp1.getAge());
}
}
答案 1 :(得分:2)
您的比较器没有任何问题。只是你选择按升序排列项目。
我建议你看看Guava Ordering课程。它有一个非常方便的方法reverse
。
如果你有升序比较器,那么就可以很容易地根据升序比较器生成降序比较器。
如果你想修改你的比较器以进行降序排序,只需在声明中切换变量名并保持逻辑相同,例如
public int compare(Employee emp2, Employee emp1){
答案 2 :(得分:0)
java.utils.Collections
将指定的列表排序为升序顺序,因此列表中的第一个员工年龄为4岁。
答案 3 :(得分:0)
更改if条件并反转您的比较条件!自然分类从小到高,而你需要从高到低的顺序