JavaTM Platform
Standard Ed. 6

java.util
인터페이스 Comparator<T>

형태 파라미터:
T - 이 Comparator에 의해 비교되는 객체의 형태
기존의 구현 클래스의 일람:
Collator , RuleBasedCollator


public interface Comparator<T>

객체의 컬렉션으로 「전체 순서 붙이고」를 실시하는 비교 함수입니다. Comparator (Comparator)를 소트 메소드 (Collections.sortArrays.sort 등)에 건네주면(자), 소트순서를 정확하게 제어할 수 있습니다. 또, Comparator를 사용하면(자),소트 세트소트 맵 등의 특정의 데이터 구조의 순서를 제어하거나자연 순서부 를 가지지 않는 객체의 컬렉션에 순서부를 제공하거나 할 수도 있습니다.

Comparator c 가 요소세트 S 로 실시하는 순서부는,S 의 모든 e1e2 에 대해 c.compare(e1, e2)==0e1.equals(e2) 와 같은 boolean 치를 가지는 경우에만 equals 와의 일관성이 있게 됩니다.

소트 세트 (또는 소트 맵)를 순서 붙이고 하기 위해서, equals 와 일관성이 없는 순서부를 실시할 수가 있는 Comparator를 사용하는 경우에는 주의가 필요합니다. 명시적인 Comparator c 를 가지는 소트 세트 (또는 소트 맵)가 세트 S 로부터의 요소 (또는 키)와 함께 사용되면(자) 가정합니다. c 에 의해 S 에 부과되는 순서부가 equals 와 일관성이 없는 경우, 소트 세트 (또는 소트 맵)의 동작은 이상하게 됩니다. 특히, 소트 세트 (또는 소트 맵)는,equals 로 정의되고 있는 세트 (또는 맵)의 일반 규약에 위반합니다.

예를 들어,(a.equals(b) && c.compare(a, b) ! = 0) 인 2 개의 요소 ab 를 Comparator c 로 빈 상태(empty)의 TreeSet 에 추가하면(자) 가정합니다. ab 는 트리 세트의 점으로부터 봐 등가는 아니기 때문에, 2 번째의 add 오퍼레이션은,Set.add 메소드의 스펙과는 다른 경우에서도, true 를 돌려주어, 트리 세트의 사이즈는 커집니다.

주:일반적으로은, Comparator로 java.io.Serializable 도 구현해 주세요. 그 이유는, Comparator를 직렬화 가능 데이터 구조 (TreeSet ,TreeMap 등) 중(안)에서 순서부 메소드로서 사용할 수 있기 때문입니다. 데이터 구조의 직렬화를 성공시키기 위해서(때문에)는, Comparator (제공되는 경우)는 Serializable 를 구현할 필요가 있습니다.

수학적으로는, 지정된 Comparator c 가 지정된 객체세트 S 에 부과하는 강제적인 순서부를 정의하는 관계는 다음과 같이 됩니다.

       {(x, y) such that c.compare(x, y) <= 0}.
이 전체 순서의 「상」은 다음과 같습니다.
       {(x, y) such that c.compare(x, y) == 0}.
 
compare 의 규약으로부터, 상이 S 에서의 「등가 관계」이며, 강제적인 순서부가 S 에서의 「전체 순서」인 것은 분명합니다. cS 로 실시하는 순서부가 「equals 와의 일관성」이 있다고 하는 경우, 그것은 순서부의 상이 객체의 equals(Object) 메소드로 정의된 등가 관계인 것을 의미합니다.
     {(x, y) such that x.equals(y)}.  

이 인터페이스는,Java Collections Framework 의 멤버입니다.

도입된 버젼:
1.2
관련 항목:
Comparable , Serializable

메소드의 개요
 int compare (T  o1, T  o2)
          순서부를 위해서(때문에) 2 개의 인수를 비교합니다.
 boolean equals (Object  obj)
          다른 객체가 이 Comparator와 「동일하다」화도인지를 나타냅니다.
 

메소드의 상세

compare

int compare(T  o1,
            T  o2)
순서부를 위해서(때문에) 2 개의 인수를 비교합니다. 최초의 인수가 2 번째의 인수보다 작은 경우는 부의 정수, 양쪽 모두가 동일한 경우는 0, 최초의 인수가 2 번째의 인수보다 큰 경우는 정의 정수를 돌려줍니다.

전술의 설명에서는,sgn(expression) 라고 하는 표기는 수학 함수 signum 함수를 나타내,expression 의 값 (부의 수, 제로, 정의 수)에 응해,-1,0,1 의 어느쪽이든을 돌려줍니다.

구현에서는, 모든 xy 에 대해서 sgn(compare(x, y)) == -sgn(compare(y, x)) 가 보증되지 않으면 안됩니다. 구현은, 모든 xysgn(compare(x, y)) == -sgn(compare(y, x)) 를 보증하지 않으면 안됩니다.

또, 구현자는, 이 관계에 추이성을 갖게할 필요가 있습니다. 즉,((compare(x, y) >0) && (compare(y, z) >0))compare(x, z) >0 를 의미합니다.

마지막으로, 구현자는,compare(x, y)==0 가 모든 zsgn(compare(x, z)) ==sgn(compare(y, z)) 를 의미하도록(듯이) 하지 않으면 안됩니다.

(compare(x, y)==0) == (x.equals(y)) 는 엄밀하게는 요구되지 않습니다. 일반적으로은, 이 조건에 위반하는 Comparator에서는 이 사실이 명확하게 나타날 필요가 있습니다. 「주: 이 Comparator는 equals 와 일관성이 없는 순서부를 부과합니다.」(와)과 같이 가리켜 주세요.

파라미터:
o1 - 비교 대상의 최초의 객체
o2 - 비교 대상의 2 번째의 객체
반환값:
최초의 인수가 2 번째의 인수보다 작은 경우는 부의 정수, 양쪽 모두가 동일한 경우는 0, 최초의 인수가 2 번째의 인수보다 큰 경우는 정의 정수
예외:
ClassCastException - 인수의 형태가 이 Comparator에 의한 비교를 방해하는 경우

equals

boolean equals(Object  obj)
다른 객체가 이 Comparator와 「동일하다」화도인지를 나타냅니다. 이 메소드는,Object.equals(Object) 의 일반 규약에 따를 필요가 있습니다. 또, 이 메소드는, 지정된 객체도 Comparator이며, 그것이 이 Comparator와 같은 순서부를 실시하는 경우에만 true 를 돌려줄 수가 있습니다. 따라서,comp1.equals(comp2) 는 모든 객체 참조 o1o2sgn(comp1.compare(o1, o2)) ==sgn(comp2.compare(o1, o2)) 를 의미합니다.

일반적으로,Object.equals(Object) 는 변경하지 않는 편이 안전합니다. 다만, 이 메소드를 변경해, 2 개(살)의 개별의 Comparator가 같은 순서부를 실시하는 것을 프로그램이 판단할 수 있도록(듯이) 하는 것으로, 퍼포먼스가 향상하는 경우가 있습니다.

오버라이드(override):
클래스 Object 내의 equals
파라미터:
obj - 비교 대상의 참조 객체
반환값:
지정된 객체도 Comparator이며, 그것이 이 Comparator와 같은 순서부를 실시하는 경우에만 true
관련 항목:
Object.equals(Object) , Object.hashCode()

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.