【问题标题】:Java HashMap reverse wayJava HashMap 反向方式
【发布时间】:2017-09-29 06:47:54
【问题描述】:

我需要在 2 种对象之间建立一个映射,比如说,出于演示目的,String 和 Long。

我知道 HashMap 具有 O(1) 的搜索性能,这很棒。我正在使用这样的东西:

HashMap<String, Long> a = new HashMap<String, Long>();

当我想按键搜索时,这很有效。但是,现在我还需要按值查找键。

如果我开始迭代键,那么我将失去性能。

我想到的第一个选项是反过来创建另一个 HashMap。

HashMap<Long, String> reverseA = new HashMap<Long, String>();

每当我写一个,就写另一个。

难道没有一个特定的类能够通过键和值进行搜索,并且性能如此出色?

我应该使用两个 HashMap 创建自己的类吗?

还有其他解决方案吗?

【问题讨论】:

  • 也许 Guava 的 BiMap 包含您要查找的内容。
  • 当然,它们的键是唯一的,值可能不是这样
  • @ScaryWombat:好吧,如果reverseA 映射是一个选项,那么值最好是唯一的,否则会有一点不一致。
  • 如果您不想使用第三个 API,为什么不使用没有开销的新 Streaming API 过滤地图,除非您进行终端调用?
  • 为什么不使用 2 个 HashMap?这比仅针对这种情况向 Guava 添加新的依赖项要好。

标签: java collections hashmap


【解决方案1】:

你可以使用 Guava BiMap

BiMap<String, Long> map = HashBiMap.create();
map.put("a", 1L);
map.put("b", 2L);
map.put("c", 3L);

System.out.println(map.get("b")); // 2L
System.out.println(map.inverse().get(2L)); // "b"

另一种选择是 Apache commons BidiMap

BidiMap<String, Long> map = new DualHashBidiMap<>();
map.put("a", 1L);
map.put("b", 2L);
map.put("c", 3L);

System.out.println(map.get("b")); // 2L
System.out.println(map.inverseBidiMap().get(2L)); // "b"

【讨论】:

    【解决方案2】:

    Java 本身不提供任何东西,但 Guava 有 BiMap,它具有支持高效反向查找的反向视图。

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 2010-12-12
      • 2013-12-23
      • 2017-01-25
      • 2017-07-20
      • 2018-05-11
      • 2015-06-03
      • 2014-08-22
      相关资源
      最近更新 更多