2013-02-11 56 views
0

我有以下BIMAP集合:如何正確地使用共享密鑰來關聯多個BiMap集合?

BiMap<String,String> accessIds = HashBiMap.create(); 
accessIds.put("FOO","accessId 1"); //This access Id is common to both FOO and BAR 

BiMap<String,String> merchants = HashBiMap.create(); 
merchants.put("FOO", "merchant 1"); //Both FOO and BAR each have unique merchants 
merchants.put("BAR", "merchant 2"); 

這些是4個總集合我現在有2。所有4個集合共享相同的密鑰,但具有不同的值。

我的問題是:如何確保我可以獲得merchant 2當我有一個accessIds密鑰FOO

在有人指出這兩個集合實際上沒有共享相同的密鑰之前,請記住BiMap強制實施唯一值,因此我無法在集合中列出"BAR","accessId 1"

我不相信BiMap是正確的收藏,但我確實使用了它的inverse()方法。如果有更適合的集合(或者我忽略的其他方法),請告訴我。

僅供參考:我使用Guava-14.0-rc1進行BiMap收集。

+0

告訴我們您的使用案例,而不是非工作解決方案。如果幾個鍵在accessIds中可以具有相同的值,那麼顯然它不能是BiMap。如果他們共享相同的accessId,爲什麼FOO或BAR優先於另一個呢?爲什麼不使用真實的物體? – 2013-02-11 23:11:08

+0

@FrankPavageau在我的其他案例中,accessId可以直接映射到特定值。我的用例需要一個Access ID,然後從各個集合中抓取幾個數據以構建對各種Web服務進行身份驗證所需的對象。我沒有在這個片段中提供任何其他具體信息,因爲即使它不代表真實信息,它也可以說明我需要完成的任務。正如我在問題中所述,我不相信BiMap是正確的,所以如果您有其他建議,請告訴我。 – 2013-02-12 02:05:47

回答

1

根據您的評論,在您的工作流程中,Access ID是一個關鍵值,而不是一個值,至少在一個案例中具有多個關聯值而不是一個值。

您可以使用您的訪問ID的Multimap,假設你則可以選擇保留的關鍵,其值,以訪問其他Map S(或BiMap S,雖然它是通過你的榜樣不明所以然BiMap小號,但我想這是無關的)。

ImmutableMultimap.Builder<String, String> builder = ImmutableMultimap.builder(); 
builder.put("FOO", "accessId 1"); 
builder.put("BAR", "accessId 1"); 
ImmutableMultimap<String, String> accessIds = builder.build(); 
ImmutableMultimap<String, String> byAccessIds = accessIds.inverse(); 

Collection<String> keys = byAccessIds.get("accessId 1"); // ["FOO", "BAR"] 
String key = doSomething(keys); // "BAR" is chosen 
String merchant = merchants.get(key); // "merchant 2" 

如果你不能使用一成不變的結構,你也可以(用HashMultimap例如)建立accessIds定期Multimap和使用Multimaps.invertFrom()逆它。

+0

+1用於顯示不可變的解決方案。 – 2013-02-12 13:25:22