是否可能在番石榴,
要在BiMap
中针对关键值和多个值进行反向查找?确切地说,我有密钥和相应的多个值,我想从一个值中获取密钥。
要在LinkedHashMap
中存储多个值?确切地说,我想以某种顺序存储,键 - 多个值,因此我可以在列表中获得关键位置。
答案 0 :(得分:7)
广告。 1。是的,您可以使用BiMap<K, V>
进行反向查询,只需在BiMap
上拨打inverse
即可获得反向BiMap<V, K>
查看<{1}}的{{1}}。
示例(取自Guava的测试套件):
BiMap
广告。 2。假设你的意思是“我想存储,键 - >多个[集合]值”(public void testMapConstructor() {
/* Test with non-empty Map. */
Map<String, String> map = ImmutableMap.of(
"canada", "dollar",
"chile", "peso",
"switzerland", "franc");
HashBiMap<String, String> bimap = HashBiMap.create(map);
assertEquals("dollar", bimap.get("canada"));
assertEquals("canada", bimap.inverse().get("dollar"));
}
),ListMultimap
可能就是你想要的,更精确ArrayListMultimap
(保留值顺序)或LinkedListMultimap
(保留键和值顺序)。如果你的对象是不可变的,我强烈建议你使用ImmutableListMultimap
。
您还可以使用factory(位详细)创建自己的Map<K, Collection<V>>
实现,即我使用:
Multimap
P.S。请查看Guava's wiki,其中解释了private static <K, V> ListMultimap<K, V> makeLinkedArrayListMultimap() {
return Multimaps.newListMultimap(Maps.<K, Collection<V>>newLinkedHashMap(),
new Supplier<List<V>>() {
@Override public List<V> get() {
return Lists.newArrayList();
}
});
}
public static void main(final String[] args) {
final ListMultimap<String, String> multimap = makeLinkedArrayListMultimap();
multimap.putAll("one", ImmutableList.of("zero", "three"));
multimap.putAll("two", ImmutableList.of("three", "four", "three"));
multimap.putAll("three", ImmutableList.<String>of()); // note that this doesn't add key to multimap
multimap.put("four", "forty-two");
System.out.println(multimap);
// prints {one=[one, three], two=[three, four, three], four=[forty-two]}
final List<String> listForOnes = multimap.get("one");
System.out.println(listForOnes.get(0));
// prints zero
}
和BiMap
。
答案 1 :(得分:3)
最接近Guava的是Multiset
,可以将多个值映射到key,但我怀疑它是否符合您的要求。
BiMap
,它需要唯一的值并且可以提供反向映射(值 - &gt;键),但由于您需要将多个值映射到同一个键,这也不太适合。 答案 2 :(得分:3)
正如@Xaerxess在his answer中对您的第二个问题所说,您可以使用ListMultimap
创建自己的LinkedHashMap
Multimaps.newListMultimap
作为其支持地图方法
对于第一个问题,您将键映射到多个值(即Multimap
),您可以使用方法Multimaps.invertFrom
创建原始Multimap
的反转副本做反向查找。此外,您可以创建原始文件的ImmutableListMultimap
副本,并使用其inverse()
方法获取反转,但这只是复制原文,就像Multimaps.invertFrom
一样(尽管它会缓存它如此反复调用inverse()
会返回相同的副本。)
如果您不介意额外的内存消耗,想要进行多次反向查找,并且不需要反向复制以保持最新的原始更改,这可能是值得的你创造它。如果您只想查找映射到一个特定值的键,则可以在条目的一次迭代中执行此操作,而无需创建完整副本。