0

我有以下 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 个集合共享相同的键,但值不同。

我的问题是:当我有一个 accessIds 键时,如何确保我可以得到?merchant 2FOO

在有人指出这两个集合实际上并不共享相同的键之前,请记住 BiMap 强制执行唯一值,因此我无法"BAR","accessId 1"在集合中列出。

我不相信 BiMap 是正确的集合,但我确实使用了它的inverse()方法。如果有更适合的集合(或我忽略的其他方法),请告诉我。

仅供参考:我将 Guava-14.0-rc1 用于 BiMap 集合。

4

1 回答 1

1

根据您的评论,在您的工作流程中,访问 ID 是一个键,而不是一个值,在至少一种情况下,它具有多个关联的值而不是一个。

您可以将 aMultimap用于您的 Access IDS,假设您可以选择保留哪个值作为访问其他Maps(或BiMaps,尽管通过您的示例不清楚为什么它们 BiMaps,但我想这是不相关的)。

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"

如果您不能使用不可变结构,您还可以构建一个正则Multimapfor accessIds(例如使用 a HashMultimap)并使用 反转它Multimaps.invertFrom()

于 2013-02-12T10:59:40.177 回答