Guava的BiMap和LinkedHashMap问题

时间:2012-03-12 09:22:16

标签: java data-structures guava bimap

是否可能在番石榴,

  1. 要在BiMap中针对关键值和多个值进行反向查找?确切地说,我有密钥和相应的多个值,我想从一个值中获取密钥。

  2. 要在LinkedHashMap中存储多个值?确切地说,我想以某种顺序存储,键 - 多个值,因此我可以在列表中获得关键位置。

3 个答案:

答案 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,但我怀疑它是否符合您的要求。

  1. 我怀疑使用值查找密钥是好主意(当您有多个值映射到单个密钥时),为了做到这一点,您的值应该是唯一的并考虑您的数据结构(类似于{{1} })不能保证具有唯一值。
  2. guava的另一个选项是BiMap,它需要唯一的值并且可以提供反向映射(值 - &gt;键),但由于您需要将多个值映射到同一个键,这也不太适合。

答案 2 :(得分:3)

正如@Xaerxesshis answer中对您的第二个问题所说,您可以使用ListMultimap创建自己的LinkedHashMap Multimaps.newListMultimap作为其支持地图方法

对于第一个问题,您将键映射到多个值(即Multimap),您可以使用方法Multimaps.invertFrom创建原始Multimap的反转副本做反向查找。此外,您可以创建原始文件的ImmutableListMultimap副本,并使用其inverse()方法获取反转,但这只是复制原文,就像Multimaps.invertFrom一样(尽管它会缓存它如此反复调用inverse()会返回相同的副本。)

如果您不介意额外的内存消耗,想要进行多次反向查找,并且不需要反向复制以保持最新的原始更改,这可能是值得的你创造它。如果您只想查找映射到一个特定值的键,则可以在条目的一次迭代中执行此操作,而无需创建完整副本。