2013-02-11 22 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