|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
T
- 이 Comparator에 의해 비교되는 객체의 형태public interface Comparator<T>
객체의 컬렉션으로 「전체 순서 붙이고」를 실시하는 비교 함수입니다. Comparator (Comparator)를 소트 메소드 (Collections.sort
나 Arrays.sort
등)에 건네주면(자), 소트순서를 정확하게 제어할 수 있습니다. 또, Comparator를 사용하면(자),소트 세트
나소트 맵
등의 특정의 데이터 구조의 순서를 제어하거나자연 순서부
를 가지지 않는 객체의 컬렉션에 순서부를 제공하거나 할 수도 있습니다.
Comparator c 가 요소세트 S 로 실시하는 순서부는,S 의 모든 e1 및 e2 에 대해 c.compare(e1, e2)==0 가 e1.equals(e2) 와 같은 boolean 치를 가지는 경우에만 equals 와의 일관성이 있게 됩니다.
소트 세트 (또는 소트 맵)를 순서 붙이고 하기 위해서, equals 와 일관성이 없는 순서부를 실시할 수가 있는 Comparator를 사용하는 경우에는 주의가 필요합니다. 명시적인 Comparator c 를 가지는 소트 세트 (또는 소트 맵)가 세트 S 로부터의 요소 (또는 키)와 함께 사용되면(자) 가정합니다. c 에 의해 S 에 부과되는 순서부가 equals 와 일관성이 없는 경우, 소트 세트 (또는 소트 맵)의 동작은 이상하게 됩니다. 특히, 소트 세트 (또는 소트 맵)는,equals 로 정의되고 있는 세트 (또는 맵)의 일반 규약에 위반합니다.
예를 들어,(a.equals(b) && c.compare(a, b) ! = 0)
인 2 개의 요소 a
및 b
를 Comparator c
로 빈 상태(empty)의 TreeSet
에 추가하면(자) 가정합니다. a
와 b
는 트리 세트의 점으로부터 봐 등가는 아니기 때문에, 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 에서의 「전체 순서」인 것은 분명합니다. c 가 S 로 실시하는 순서부가 「equals 와의 일관성」이 있다고 하는 경우, 그것은 순서부의 상이 객체의
equals(Object)
메소드로 정의된 등가 관계인 것을 의미합니다. {(x, y) such that x.equals(y)}.
이 인터페이스는,Java Collections Framework 의 멤버입니다.
Comparable
,
Serializable
메소드의 개요 | |
---|---|
int |
compare (T o1,
T o2)
순서부를 위해서(때문에) 2 개의 인수를 비교합니다. |
boolean |
equals (Object obj)
다른 객체가 이 Comparator와 「동일하다」화도인지를 나타냅니다. |
메소드의 상세 |
---|
int compare(T o1, T o2)
전술의 설명에서는,sgn(expression) 라고 하는 표기는 수학 함수 signum 함수를 나타내,expression 의 값 (부의 수, 제로, 정의 수)에 응해,-1,0,1 의 어느쪽이든을 돌려줍니다.
구현에서는, 모든 x 와 y 에 대해서 sgn(compare(x, y)) == -sgn(compare(y, x)) 가 보증되지 않으면 안됩니다. 구현은, 모든 x 및 y 로 sgn(compare(x, y)) == -sgn(compare(y, x)) 를 보증하지 않으면 안됩니다.
또, 구현자는, 이 관계에 추이성을 갖게할 필요가 있습니다. 즉,((compare(x, y) >0) && (compare(y, z) >0)) 는 compare(x, z) >0 를 의미합니다.
마지막으로, 구현자는,compare(x, y)==0 가 모든 z 로 sgn(compare(x, z)) ==sgn(compare(y, z)) 를 의미하도록(듯이) 하지 않으면 안됩니다.
(compare(x, y)==0) == (x.equals(y)) 는 엄밀하게는 요구되지 않습니다. 일반적으로은, 이 조건에 위반하는 Comparator에서는 이 사실이 명확하게 나타날 필요가 있습니다. 「주: 이 Comparator는 equals 와 일관성이 없는 순서부를 부과합니다.」(와)과 같이 가리켜 주세요.
o1
- 비교 대상의 최초의 객체o2
- 비교 대상의 2 번째의 객체
ClassCastException
- 인수의 형태가 이 Comparator에 의한 비교를 방해하는 경우boolean equals(Object obj)
Object.equals(Object)
의 일반 규약에 따를 필요가 있습니다. 또, 이 메소드는, 지정된 객체도 Comparator이며, 그것이 이 Comparator와 같은 순서부를 실시하는 경우에만 true 를 돌려줄 수가 있습니다. 따라서,comp1.equals(comp2)
는 모든 객체 참조 o1 및 o2 로 sgn(comp1.compare(o1, o2)) ==sgn(comp2.compare(o1, o2)) 를 의미합니다. 일반적으로,Object.equals(Object) 는 변경하지 않는 편이 안전합니다. 다만, 이 메소드를 변경해, 2 개(살)의 개별의 Comparator가 같은 순서부를 실시하는 것을 프로그램이 판단할 수 있도록(듯이) 하는 것으로, 퍼포먼스가 향상하는 경우가 있습니다.
Object
내의 equals
obj
- 비교 대상의 참조 객체
true
Object.equals(Object)
,
Object.hashCode()
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.