2009-12-28 3 views
3

동일한 클래스의 객체를 저장하는 여러 세트가 있지만 각각에 대해 다른 신원 함수를 지정하려고합니다 (즉, Ax == Bx, 다른 A == B 인 경우 Ay == By).동일한 객체에 대해 다중 해시 함수 정의

현재 각각에 대해 서로 다른 Comparator가 정의 된 TreeSets를 사용합니다. HashSet으로 전환하려면 어떻게 동일한 작업을 수행 할 수 있는지 궁금합니다. Java는 정렬 된/트리 기반 콜렉션에 대한 비교기와 동일한 방식으로 별도의 해시 함수를 전달할 수 없습니다. 내가 할 수있는 유일한 방법은 다른 래퍼 클래스를 만들고 각 HashSet의 요소에 대해 hashCode() 메서드를 구현하는 것입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

2

GNU Trove에 THashSet을 사용할 수 있습니다.이 방법은 여러 해싱 전략을 지원합니다.

7

각 세트에 대해 별도의 하위 클래스를 만드는 방법. 각 하위 클래스의 유일한 차이점은 기준에 맞는 재정의 된 해시 함수입니다.

+3

하위 클래스를 개인 내부 클래스로 구현하고 사용자가 원하는 동등 의미를 얻기 위해 팩토리 메서드를 제공 할 수 있습니다. 이것은 선택을 완전히 캡슐화합니다 – Andrew

3

나는 더 나은 방법을 모르고있다. 제안 된 솔루션 (다른 비교 논리를 가진 래퍼 클래스)은 매우 합리적으로 들립니다.

hashCode 메소드 구현에 대해 언급 했으니 equals도 구현해야합니다.

2

다른 옵션이있다 : 당신은 HashMap의 소스를 복사하여 다른 뭔가 방법 hash(Object key)을 대체 할 수있다 (예를 들어, TreeMapComparator처럼 작동하는 Hasher를 호출).

+0

좋습니다. Collection 인터페이스를 구현하는 것을 잊지 마십시오. – Bozho

+0

감사합니다. 나는 이것이 최선의 일이라고 생각합니다. 필자는 Peter Lawry의 대답을 받아들입니다. 그는 내 자신의 코드를 코딩하는 대신 기성품 구현을 사용하기를 제안했기 때문입니다. – MAK

관련 문제