2008-10-26 4 views
8

자바 비교기

public Comparator getComparatorForClass(Class clazz) {} 
그것은 문자열, 더블, 정수와 같은 물건 비교기를 반환

으로, 자바 비교기 공장의 어떤 종류의 일 명을 알고합니까하지만

public void addComparatorForClass(Class clazz, Comparator comparator) {} 

있을 것입니다 임의의 유형의 경우.

factory.getComparatorForClass(x.getClass()).compare(x, y) 

단순히 Comparable를 구현하고 작성할 수 :

x.compareTo(y) 

문자열, 원시 래퍼, 표준 컬렉션을 이미 Comparable을 구현하는 대신

+1

Comparable은 (는) 좋은 옵션입니다. 그러한 공장은 일반적으로 의미가 없다. –

+0

둘 이상의 Comparator를 가진 클래스에서는 어떻게됩니까? 예 : 이름이나 ID로 정렬 할 수있는 직원? –

답변

4

나는 내 머리 꼭대기에서 그와 같은 것을 알지 못합니다. 이와 같은 것을 정말로 필요로한다면, 스스로를 구현하는 것이 너무 어렵지 않아야합니다.

하지만 왜 이런 것이 필요한지 자세히 설명해 주시겠습니까? 일반적으로 클래스에 대한 "기본"비교자가 있어서는 안됩니다. 클래스에 일종의 자연 순서가있는 경우에는 java.lang.Comparable을 구현하고 대신 Comparable#compareTo(Object) : int을 구현해야합니다.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

10

커먼즈 랭에서 사용 CompareToBuilder.

Comparable.compareTo (Object) 메소드 구현을 도와줍니다.

public class MyClass { 
    String field1; 
    int field2; 
    boolean field3; 

    ... 

    public int compareTo(Object o) { 
    MyClass myClass = (MyClass) o; 
    return new CompareToBuilder() 
     .appendSuper(super.compareTo(o) 
     .append(this.field1, myClass.field1) 
     .append(this.field2, myClass.field2) 
     .append(this.field3, myClass.field3) 
     .toComparison(); 
    } 
} 
1

비교기는 .. 이것은 재사용 가능한 코드 구현에 기반을 확장 할 필요가있는 당신의 사용자 지정 비교를 할 수 있습니다 이러한 방법 .. 다음과 같이

이 클래스 쓰기 코드를 사용하려면 데이터 .. 구현은 간단합니다 .. 그냥 Comparator 인터페이스를 구현 ... compareto 메서드를 재정의하고 비교 코드를 .. 배치하고 값의 측면에서 더 큰 것이라고 생각하는 값을 반환합니다.

0

기본 비교자가 존재하지 않습니다. Java에서. 그러나 파생 된 Comparable 클래스의 compareTo() 메서드 대신 Comparator를 사용하려는 사용자 지정 검색기를 사용하여 코딩하는 경우 정적 비교기 클래스를 기본 비교기로 쓸 수 있습니다. compareTo() 메서드를 호출하여 compare() 메서드를 호출합니다.

예 :

클래스 탐색기> { 전용 비교기 비교기;

Searcher(Comparator<T> comparator) { 
    this.comparator = comparator; 
} 

Searcher() { 
    this(new DefaultComparator<T>()); 
} 

int search(...) { 
    ... 
} 

private static class DefaultComparator<E extends Comparable<E>> 
     implements Comparator<E> { 
    public int compare(E o1, E o2) { 
     return o1.compareTo(o2); 
    } 
}