我正在尋找一個基於元素屬性的查找的Set
實現。以番石榴術語思考,可以使用Function<Element, SearchKey>
(預計在所有集合元素中是唯一的)構建,並提供返回Element
的方法find(SearchKey key)
,其功能將返回key
。Java中的「IndexedSet」,「MapSet」或「SetMap」實現
明顯假設將需要滿足:
- 的
function(element)
結果對element
在集合整個生存期內保持不變。 - 函數給出了所有元素集合 獨特結果
原因是:
有時有必要對Set<Element>
和場類型不能在JPA實體或在4RD的情況下被改變爲Map<SearchKey, Element>
(像黨代碼)。儘管如此,當構建這樣一個對象時,人們可以安全地使用自己的Set
實現類似Map
的功能。
替代方案:
有一些替代方案,我已經發現,其中沒有一個似乎完全沒有
Map
般的功能 - 使用線性搜索find(SearchKey)
實現(與每位Set
執行:)- 使用
TreeSet
與Comparator
比較SearchKeys
- 有點像破解,尤其是這不再尊重元素平等
「查找」方法被調用ceiling
,並要求您構建人工Element
用於查找目的(uogh ...) - 「等價設置」(http://code.google.com/p/guava-libraries/issues/detail?id=576) - 但是,不落實,不似乎將是
(如果你想回答,你不知道有更多的選擇 - 節省您的時間和沒有。這是我已經知道的東西,我將無法接受你的答案。)
您是否肯定需要一個* single *對象來擔任這兩個角色,或者您是否擁有該集合,然後將其分別索引'Maps.uniqueIndex'?您始終可以創建自己的類型,使用該構思與組合和委派相結合,從一個對象中公開兩組接口。 –
那麼你的理由部分說,你爲什麼仍然需要一個'集合' - 它並不能解釋爲什麼你不能*都*。 –
你的意思是子類化一個'HashSet',並有一個額外的「索引」字段作爲地圖並由我自己管理?會做,但仍然有點容易出錯。 –