2012-06-17 2 views
0

나는 compareTo 메소드를 오버라이드하는 데 문제가 있습니다. 이 프로그램은 다양한 직원 유형을 시뮬레이트하고 직원 유형별로 완벽하게 정렬하지만 총비용으로 2 차 분류를 수행 할 수는 없습니다. 클래스 이름/직원 유형별로 정렬하면 grossPay로 정렬해야하는데 이는 도우미 방법으로 얻을 수 있습니다. 다음은 코드입니다.CompareTo 오버라이드 정렬

public int compareTo(Object o) { 

    Employee other = (Employee) o; 

    if(other instanceof Salaried) 
     return -1; 

    else if(other instanceof Daily) 
     return 1; 

    else 
     return 0; 
} 

나는 employess의 arraylist와 Collection.sort()를 사용하고 있습니다. 인쇄 할 때 직원 유형별로 훌륭한 정렬 목록을 얻지 만 grossPay별로 정렬해야합니다.

+0

[http://stackoverflow.com/questions/369512/best-way-to-compare-objects-by-multiple-fields](http://stackoverflow.com/questions)를 참조하십시오./369512/최선의 방법 - 개체 - 다중 필드 비교). 그것은 (내가 아는 한) 당신의 질문에 꽤 많이 대답합니다. – purtip31

답변

3

유형 비교 후 grossPay를 비교할 수 있습니다. grossPay이 숫자 인 경우. 전체 순서와 일치

public int compareTo(Object o) { 

    Employee other = (Employee) o; 
    if(this instanceof Daily && other instanceof Salaried) 
     return -1; 

    else if(this instanceof Salaried && other instanceof Daily) 
     return 1; 

    else 
     return this.getGrossPay() - other.getGrossPay(); 
} 
+2

닫기,하지만 오버플로 가능성 때문에'compareTo '를 구현하기 위해 정수 빼기를 사용해서는 안됩니다. 'getGrossPay()'가 벌써 Integer 값을 돌려주고있는 경우 Integer.compareTo를 사용할 수 있습니다 만, 원시적 인 경우는 「<' and '>」를 고수하십시오. Java 7에는 정적 메서드 인 Integer.compare (int, int)가 있습니다. –

+0

불행히도 이것은 확실하지 않습니다. 'this'가 Salaried이고'other'가 Salaried이면 -1을 반환합니다. 두 피연산자를 교환하면 '-1'을 다시 반환합니다. 따라서 비교는 총 주문과 일치하지 않습니다. 정렬은 잘못된 대답을 만들거나 결코 끝나지 않을 수 있습니다. – Gene

+0

@Gene 나는 나의 대답을 편집했다. – plucury

6

compareTo해야 반환 결과. 그렇지 않으면 정렬 결과가 어떤 식 으로든 보장되지 않습니다. 전체 주문은 A<B이면 B>A이고 A==B 인 경우 B==A을 의미합니다. 즉, thisother을 전환 할 수 있으며 그 결과는 일관됩니다. 제시 한 코드는 직원 유형에도이 작업을 수행하지 않습니다.

compareTo이 전체 주문과 일치하지 않으면 sort이 잘못된 대답을 만들거나 종료되지 않습니다.

시스템에 직원 유형이 3 가지인지 2인지는 분명하지 않습니다. 2라고 가정 해 봅시다. 그리고 우리가 possiblities를 통해 작업해야합니다

this  other result 
------------------------ 
salaried salaried equal 
daily salaried < 
salaried daily > 
daily daily equal 

우리는 이것과 다른 직원 유형에서 동일하다는 설립 한 후에 만 ​​우리가 총 급여입니다 보조 정렬 키를 가지고 간다.

그래서이를 코딩하는 한 가지 방법은 다음과 같습니다 나는이가 Employee에 구현되어 있으리라 믿고있어

// Assume this and o have type Daily or Salaried. 
public int compareTo(Object o) { 
    if (this instanceof Daily && o instanceof Salaried) return -1; 
    if (this instanceof Salaried && o instanceof Daily) return +1; 
    // The employee types must be equal, so make decision on pay. 
    Employee e = (Employee)o; 
    return grossPay() < e.grossPay() ? -1 : 
     grossPay() > e.grossPay() ? +1 : 0; 
} 

.

마지막으로 Comparator을 사용하여이 종류를 구현하는 것이 좋습니다. compareTo 메서드는 기본 키 역할을하는 고유 한 ID 번호의 숫자 순서와 같은 "자연"정렬 순서에 대해 예약해야합니다. 이 정렬 기준은 "자연스러운"것으로 보이지 않습니다.

+0

+1 '비교 자'. – Genzer

관련 문제