2013-08-22 1 views
4

요소 등록 정보를 기반으로 조회를 제공하는 Java에서 Set 구현을 찾고 있습니다. 구아바 용어로 생각하면 Function<Element, SearchKey> (모든 요소 집합에서 고유해야 함)을 사용하고 을 반환하는 find(SearchKey key) 메서드를 제공하면 함수가 key을 반환합니다. 필요Java의 "IndexedSet", "MapSet"또는 "SetMap"구현

명백한 가정은 만족한다 :

  • function(element)의 결과는 세트 element의 전체 수명 동안 일정하다.
  • 함수는 모든 일련의 요소
  • 고유 결과를 제공

이유 :
가끔 Set<Element>에 대한 필요성이 상기 필드 타입은 JPA 엔티티 또는 4 회의 경우처럼 (a Map<SearchKey, Element>로 변경할 수 없다 파티 코드). 그럼에도 불구하고 이런 객체를 만들 때 Map과 같은 기능을 가진 Set 구현을 안전하게 사용할 수 있습니다.

대안 :

  • Map -like 능력을 가지고 있지 완벽한 것 어느 것도 이미 발견 한 몇 가지 대안이있다 - find(SearchKey) 구현을위한 선형 검색을 사용하여가 (모든 작동 Set 구현 :
  • TreeSetComparator과 비교하는 것 SearchKeys - 이 더 이상 요소 평등
    을 존중 특히 것을
    를 해킹하지 않는
  • 은 "등가 설정"(... uogh) 메소드가 ceiling이라고하고 조회 목적을 위해 인공 Element를 구성해야한다 (http://code.google.com/p/guava-libraries/issues/detail?id=576) "을 찾아"-하지만 당신의 시간을 절약하고 금지 - 구현되지 않고,하지 않는 것 당신이 더 이상 대안을 모르는에 대답하려는 경우

(될 것한다. 이것은 내가 이미 알고있는 것입니다, 당신의 대답을 받아 들일 수 없을 것입니다.)

+3

두 개의 역할을 제공하는 * 단일 * 개체가 꼭 필요합니까, 아니면 집합을 가지고 개별적으로 색인을 생성 할 수 있습니까? 'Maps.uniqueIndex'와 함께? 당신은 언제나 컴포지션과 위임을 결합하여 그 아이디어를 사용하여 하나의 객체에서 두 인터페이스 집합을 모두 노출하는 고유 한 유형을 생성 할 수 있습니다. –

+0

당신의 이유는 왜 'Set'이 필요한지에 대한 이유입니다. 왜 * both *를 가질 수 없는지 설명하지 못합니다. –

+0

예. 'HashSet'을 서브 클래스 화하고 추가적인 "인덱스"필드를지도로 만들고 그것을 스스로 관리 할 수 ​​있습니까? 그래도 약간의 오류가 발생하기 쉽습니다. –

답변

1

는, 그렇지 않으면 HashBiMap.keySet()ForwardingSet를 통해 매우 간단합니다. 내 trivial implementation에만 addaddAll 만 신경 쓰면 다른 모든 것들도 아무런 노력없이 작동해야합니다. 하나의 테스트가 없으므로 Guava testlib을 사용하는 것이 좋습니다.

+0

좋은. 도서관이 아니더라도 :) –

+0

하지만 거의 ...BiMap은 거의 모든 작업을 수행합니다. 당신은 Guava 친구들에게이 기능을 추가하도록 설득하려고 할 수 있습니다. 그러나 나는 그것을 필요로하는 사람에 대해 들어 본 적이 없기 때문에 회의적입니다. 비록 내가 확신하지만, 나는 이것을 오래 전에 원했다. – maaartinus

2

저는 요소 속성을 기반으로 룩업을 제공하는 Java의 Set 구현을 찾고 있습니다.

지도가있는 것이고 그렇습니다. 조회 할 대상을 나타내는 키 객체를 작성해야합니다.

이 코드는 Java에서 가장 간단하고 효율적인 솔루션이므로 약간 불쾌하지만 걱정하지 않아도됩니다.

BTW : 일반적으로 세트는 JRE의지도 위에 레이어로 구현됩니다. 이는 이상적인 IMHO가 아닙니다.내가 제대로 질문을 이해한다면

+0

불행히도'Map'에는 호출자의 키를 계산할'add (Element)'메소드가 없습니다. 게다가, 나는'Set '을'Map'이 AFAIK를 구현하지 않는 데이터 유형으로 제한한다고 말한 것 같습니다. I *가 데이터 유형을 변경할 수있는 경우 - 나는 당신, 온전함 및지도를 모두 가지고 있습니다. –

+0

맵을 작성하는 데 이와 같은 메소드 또는 하위 클래스를 작성하는 것이 얼마나 복잡한가요? 직접 키를 파생하는 것이 어렵다면, 모델을 변경하지 않는 것이 좋습니다. 왜 당신은 주어진 컬렉션에 정확히 똑같은 방법을 가지고 있습니다. –

+0

네 말이 맞아! 'IndexedCollection'도 마찬가지입니다. 기존 구현이 있습니까? 그렇지 않다면 나는 해결 방법 인 'TreeSet'을 유지할 것입니다. –

1

,이 개 대안이 내 마음에 와서 :

  1. 하여 해킹의 변형 : YourElementYourSearchKey을 비교하는 비교기와 TreeSet. 유형 시스템을 트릭하거나 공통 인터페이스 YourAbstractSearchKey을 작성할 수 있습니다. 단점은 다음과 같습니다 :
    • YourSearchKey 개체는 Set에 삽입 될 수 있습니다. Collections.checkedSet()이이 점에 도움이 될 수 있습니다.
    • 검색 결과는 대부분 YourElement으로 캐스팅해야합니다. 해결 방법 : 공용 인터페이스 YourAbstractSearchKey의 모든 등록 정보를 정의하고 여분의 구성 요소를 구현하려면 YourSearchKeyUnsupportedOperationException으로 지정하십시오.
  2. 비슷하지만지도가 있습니다. Map이 Map<YourAbstractSearchKey,YourElement>이 될 것이므로 YourAbstractSearchKey에 추가 속성을 추가 할 필요가 없습니다. 요소를 추가하려면 myMap.put(newElement,newElement)을 작성해야합니다. 내가 모르는 뭔가가 있어야합니다
+0

와우. 나는 이것에 대해 생각하지 않았다. 이것은 내 일반적인 hackish 접근법을 매우 따르고 있습니다 :) –

+0

(Map이 수행하지 않으면 Map ) –

+0

@PiotrFindeisen 네, 그건 제가 말한 것입니다.'Map 's. –