簡體   English   中英

我的比較器怎么了?

[英]What is wrong with my comparator?

我正在嘗試根據年齡對雇員進行排序(簡化示例),但是我無法進行單元測試。

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>

您按升序對它們進行排序,因此這恰好是代碼的預期行為。

請注意,您可以像這樣簡化Comparator以獲得所需的行為,而不必完全返回-1/1 ,任何正int或負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());
    }
}

您的比較器沒有任何問題。 只是您選擇按升序排列項目。

我建議你看番石榴訂購課。 它有一個非常方便的reverse方法。

如果您有升序比較器,那么就可以輕松生成根據升序比較器實現的降序比較器。

如果要修復比較器的降序排列,只需在聲明中切換變量名稱,並保持邏輯相同即可,例如

public int compare(Employee emp2, Employee emp1){

java.utils.Collections將指定列表按升序排序,因此列表中的第一位員工年齡為4歲。

更改if條件並反轉比較條件! 自然排序遵循從小到高的順序,而您需要從高到低的順序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM