2011-03-30 35 views
2

我需要的是一個有效的ImmutableNavigableListMultimap<Integer, HasOffset>其中HasOffset樣子:Multimaps.index()但生成NavigableMap?

interface HasOffset { 
    public int getOffset(); 
} 

但沒有ImmutableNavigableListMultimap:我想是我從一個List<HasOffset>創建一個不變的NavigableMap<Integer, List<HasOffset>>哪裏指數每HasOffset其抵消。舉例來說,如果我有這些對象:

115 Elm St. John Smith 
115 Elm St. Jane Smith 
108 Elm St. Thomas Little 
101 Elm St. Bill Jones 
115 Elm St. Buster Smith 
112 Elm St. Mary Kay 
101 Elm St. Judy Jones 

那麼我要的是一個地圖,看起來像

101 -> [Bill Jones, Judy Jones] 
108 -> [Thomas Little] 
112 -> [Mary Kay] 
115 -> [John Smith, Jane Smith, Buster Smith]  

在那裏我可以用一鍵,找到下面或按鍵上的最近的值。

番石榴可以幫助還是我堅持自己做?我喜歡Multimaps.index(),但我不認爲這次可以幫到我。

回答

4

番石榴仍然是一個Java 5庫,所以你不會在其中找到任何實施Navigable*的東西。

如果你真的願意,你可以有點八九不離十假此,首先分揀輸入Multimaps.index(),然後利用該ImmutableListMultimapkeySet().asList()觀,做一個按鍵二進制搜索,並利用它返回指數。但這顯然不一樣。

另一種選擇可能是使用Multimaps.index()取出創建地圖的枯燥程度,然後將其asMap()視圖複製到TreeMap<Integer, Collection<HasOffset>>。顯然有一些額外的工作在那裏進行,而不是自己做。

2

您可以創建一個TreeMultimap,其中keySet()方法返回SortedSet

然後,小於給定密鑰的最大密鑰是multimap.keySet().headSet(key).last(),而大於或等於給定密鑰的最小密鑰是multimap.keySet().tailSet(key).first()。您可以確定這兩個鍵中的哪一個更接近輸入鍵,並從多映射中檢索其值。

您將不得不處理輸入密鑰小於所有多圖密鑰或大於全部密鑰的情況。當頭戴式設備或尾部設置爲空時,last()first()方法會拋出NoSuchElementException