2012-01-15 10 views
8

현재 ax = 2 + bx + c 형태의 이차 함수에 대해 compareTo 메소드를 작성하고 있습니다.compareTo 메소드를 어떻게 구현합니까?

a, b, c는 생성자를 통해 클래스에 전달되는 정수 계수입니다.

compareTo 메서드에서 먼저 두 함수의 a 계수를 비교해야하지만, 두 계수가 같은 경우 b 계수를 비교합니다. b가 같으면 c의 값을 비교합니다. 나는이 가입했다

방법은 꽤 추한 었죠 :

public int compareTo(QuadraticFunction other) 
{ 
    if (a > other.a) 
     return 1; 
    else if (a < other.a) 
     return -1; 
    else if (b > other.b) 
     return 1; 
    else if (b < other.b) 
     return -1; 
    else if (c > other.c) 
     return 1; 
    else if (c < other.c) 
     return -1; 
    else 
     return 0; 
} 

그래서 내가 궁금합니다 (같은 C 년대 이전에 B 형의 전에의 비교) 비교의 이러한 "계층"시스템이있는 경우, 그들을 구현하는 가장 좋은 방법은 무엇입니까? 10 개 이상의 변수를 거쳐야하는 경우 내 방식을 작성하는 것을 상상할 수 없습니다.

답변

6

임의의 수의 계수 (모두 동일한 유형)의 경우 개별적으로 이름이 지정된 멤버 변수가 아닌 List (또는 이와 비슷한)에 저장해야합니다. 이를 통해 예제 코드를 반복으로 변환 할 수 있습니다.

+0

감사합니다! – CowZow

+1

모든 변수가 같은 유형 인 경우에만 작동합니다. –

+0

@ 루이스 와서 만 : 맞습니다. 그러나 동종 유형의 다항식 계수를 나타내는 것으로 가정하는 것이 상당히 안전하다고 생각합니다. –

0

비교를 필드별로 명확하게 구분하고 필드 당 하나의 테스트 만 필요하며 signum 메서드를 사용하여 반환 값을 생성하는 관용구를 사용할 수 있습니다.

아래 뺄셈은 int, short, char 또는 byte 필드에 적용됩니다. long의 경우 floatdouble 필드의 경우 오버플로/언더 플로 및 반올림으로 인한 정밀도의 손실을 피하기 위해 <==에 대한 별도의 검사를 사용해야합니다. 부동 소수점 값을 비교할 때 NaN도주의하십시오. Comparable 필드의 경우 null을 처리하기 위해 별도 조건을 사용한 후에 델타를 compareTo의 결과로 설정할 수 있습니다.

long delta = ((long) a.field1) - b.field1; 
if (delta != 0) { return Long.signum(delta); } 

delta = ((long) a.field2) - b.field2; 
if (delta != 0) { return Long.signum(delta); } 

... 

return 0; 
+0

'a.field1'과 co가 대부분 정수 인 경우에만 올바르게 작동합니다. – Voo

+0

@Voo, true. OP는 "a, b, c는 정수 계수"라고 말합니다. –

+0

아, 질문을 읽는 동안 단어의 수학적 의미에서 "정수 계수"를 해석했지만, 그렇습니다. 아마도 정수 int를 의미했을 가능성이 큽니다. 아직도 나는이 관용구를 사용할 때 항상 큰 뚱뚱한 경고가 중요하다고 생각한다. 수십 년 동안 오용되어서 약간주의를 기울였다. – Voo

1
쉽게 읽을

및 내장을 사용하기는 A, B, C에 대한 방법을 비교,이에 리팩토링 것 :

public int compareTo(QuadraticFunction other) { 
    if (a.equals(other.a)) { 
     if (b.equals(other.b)) 
      return c.compareTo(other.c); 
     return b.comapreTo(other.b); 
    } 
    return a.compareTo(other.a); 
} 

이 코드는 필드 Number을 가정합니다. 기본 유형 인 경우 포장 유형으로 변환하거나 a.equals(b) to a == b and change a.compareTo (b) to a - b` 중 하나를 변경하십시오.

또한 if이 반환되면 else이 필요하지 않습니다. 중복되므로 제거하십시오.

+0

'else'를 유지하면 리팩토링이 쉬워 질 것이라고 주장 할 수 있습니다. OP의 경우, 나중에 코드를 'if (cond1) {retval = 1; } else if (cond2) {retval = -1; } else ... return retval;'. –

2

Guava LibrariesComparisonChain이라는 매우 유용한 도구입니다.

코드는 다음과 같을 것이다 : 도움을

import com.google.common.base.ComparisonChain; 
... 
public int compareTo(QuadraticFunction other) { 
    return ComparisonChain.start() 
    .compare(a, other.a) 
    .compare(b, other.b) 
    .compare(c, other.c) 
    .result(); 
} 
+0

새로운 Java8'Comparator' API가 자체 응답을 보증합니까, 아니면 거기에 병합해야합니까? –

관련 문제