我的比较器出了什么问题?

时间:2012-07-29 11:47:26

标签: java int comparator

我正在尝试根据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;

4 个答案:

答案 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条件并反转您的比较条件!自然分类从小到高,而你需要从高到低的顺序