2012-07-29 5 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()); 

    } 
} 

내가 4하지만 내가 도착하기 전에 7 세와 직원이 될 것으로 기대하고있다. 예상 :

junit.framework.AssertionFailedError < 7>하지만했다 : < 4>

+1

'compareTo'가 아닌 @ user1329572입니다. 이것은 'Comparable'이 아니라 'Comparator'입니다. –

답변

2

당신의 비교기 아무 문제가 없습니다. 오름차순으로 항목을 정렬하기로 결정한 것입니다.

Guava Ordering 클래스를 살펴 보시기 바랍니다. 매우 편리한 방법이 있습니다 reverse.

오름차순 Comparator를 사용하면 상승 오름차순으로 내림차순 콤퍼레이터를 생성하는 것이 매우 간단합니다.

내림차순 정렬을 위해 비교기를 수정하려면 선언에서 변수 이름을 전환하고 논리를 동일하게 둡니다 (예 :

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

이것은 작은 정수에만 적용됩니다. 매우 큰 경우 오버플로되어 잘못된 결과가 발생할 수 있습니다. 나는 Guava의'Ints.compare (i1, i2)'를 사용하는 것을 좋아한다. –

+0

우수 포인트, @JBNizet! 그것은 내 마음을 교차시키지 않았고, 버그의 가장 미묘한 원인이 될 수있는 문제에 관한 것입니다. 물론,이 경우에, 우리가 엘프 등을 다루지 않는다면, 이것은 의도 한대로 작동 할 것입니다. –

+0

@JBNizet : 좋은 지적입니다. 그러나 'age'라는 필드에 대해서는 문제가되지 않습니다. – Keppil

0

java.utils.Collections 종류의 지정된 목록을, 그래서 목록에서 첫 번째 직원은 변경 4.

0

시대의 경우 조건 비교 조건을 뒤집으십시오! 자연 정렬은 작은 것부터 높은 순서대로 이루어 지지만, 낮은 것부터 높은 것까지를 원하는 경우