1

我正在尝试根据年龄对员工进行排序(简化示例),但我无法让我的单元测试正常工作。

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: 预期:<7> 但是是:<4>

4

4 回答 4

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());
    }
}
于 2012-07-29T11:50:43.503 回答
2

你的比较器没有问题。只是您选择按升序排列项目。

我建议你看看Guava Ordering类。它有一个非常方便的方法reverse

如果您有升序比较器,则可以非常简单地生成根据您的升序实现的降序比较器。

如果您想修复比较器以进行降序排序,只需在声明中切换变量名称并保持逻辑相同,例如

public int compare(Employee emp2, Employee emp1){
于 2012-07-29T11:50:21.177 回答
0

java.utils.Collections将指定列表按升序排序,因此列表中的第一个员工年龄为 4。

于 2012-07-29T11:51:16.510 回答
0

更改 if 条件并反转您的比较条件!自然排序遵循从小到高的顺序,而您想要从高到低的顺序

于 2012-07-29T11:53:17.370 回答