2012-07-29 54 views
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>

+1

它不是'compareTo',@ user1329572。這是一個「Comparator」,而不是「Comparable」。 – 2012-07-29 11:50:08

回答

2

沒有什麼不對您的比較。只是你選擇按升序排列項目。

我建議你看看Guava Ordering課。它有一個非常方便的方法reverse

如果您有升序比較器,則可以非常簡單地生成按照您的升序執行的降序比較器。

如果你想修正你的比較器的降序排序,只需在聲明中切換變量名並保持邏輯相同,

public int compare(Employee emp2, Employee emp1){ 
3

您可以按升序對它們進行排序,所以這正是您的代碼的預期行爲。

請注意,您可以簡化Comparator這樣得到你想要的行爲,你不必恰好返回-1/1,任何積極或消極的int會做。
[編輯] 正如@JBNizet在評論中指出的,在比較器中簡單地返回emp2.getAge() - emp1.getAge()可能會溢出大數值。這是好多了,例如使用GuavaInts.compare()方法:

class AgeComparator implements Comparator<Employee>{ 
    public int compare(Employee emp1, Employee emp2){ 
     return Ints.compare(emp2.getAge(), emp1.getAge()); 
    } 
} 
+3

這隻適用於小整數。對於非常大的,它可能溢出並給出不正確的結果。我喜歡使用番石榴的'Ints.compare(i1,i2)'。 – 2012-07-29 11:53:38

+0

優秀點,@JBNizet!它並沒有跨越我的想法,而只是關於可能導致最微妙的錯誤的那種問題。當然,在這種情況下,如果我們不處理精靈或其他事情,這將按預期工作。 – 2012-07-29 11:56:31

+0

@JBNizet:好點。但是,對於一個名爲'age'的字段,這可能不會成爲問題。 – Keppil 2012-07-29 11:56:52

0

java.utils.Collections對指定列表分爲上升順序,因此在列表中的第一個僱員的年齡4.

0

更改,如果條件並反轉你的比較條件!自然排序從小到大依次爲高,而您要從高到低排列