【问题标题】:How to have multimap functionality in Java?如何在 Java 中拥有多地图功能?
【发布时间】:2015-07-21 17:03:17
【问题描述】:

我想在 Java 中拥有 MultiMap 的功能,提供与 cpp MultiMap 相同的功能,以便我能够拥有多个具有相同值的键。容器中的多个元素可以有等效的键。我认为这会起作用:

TreeMap<Key, TreeMap<Key, Value> >. 

感谢任何帮助。

【问题讨论】:

  • Guava 实现了多图。
  • 您是否需要多个键映射到相同的值和多个值映射到相同的键?
  • @Razib :是的,我想要这两种方式。而且我不能使用番石榴和其他人。我需要在 Java 中使用它。
  • @VivinPaliath 是的,我不能使用外部库。

标签: java dictionary


【解决方案1】:

如果你想要一致的语义,你就必须自己动手。实现它的最简单方法是通过Map&lt;K, List&lt;V&gt;&gt; 支持它。这样您就可以将一个键映射到多个值。

但是,关于语义,您需要考虑一些事项。例如,假设您有以下多张地图:

a -> [1, 2, 3]
b -> [4, 5]

上面的大小会报告为2,但也可以解释为5,如果你认为Map可以这样表示:

a -> 1
a -> 2
a -> 3
b -> 4
b -> 5

这对您返回的值也有影响。返回[1, 2, 3, 4, 5] 而不是[[1, 2, 3], [4, 5]] 会更有意义。这也适用于条目集;您可能希望返回如上所示的对。

因此,可能的实现是实现Map&lt;K, V&gt; 并使用支持Map&lt;K, List&lt;V&gt;&gt;。然后,您必须在遵守多图语义的同时实现各种方法。

如果您不关心语义,而只是希望能够将单个键映射到多个值,则可以直接使用 Map&lt;K, List&lt;V&gt;&gt; 并且仍然可以获得所需的内容。

【讨论】:

  • 但是让我们看看一个场景,我想为相同的值设置多个键。使用此实现,我必须搜索所有值。可以说,A 映射到 [1,2,3],B 映射到 [2]。现在我想知道有 2 作为值的键应该是 A 和 B 。总而言之,这不会双向发挥作用。
  • @rt56 这是一个双映射,或者在这种情况下是一个双多映射,它不同于普通的多映射。要让它发挥作用,您还必须保持从值到键的支持。
【解决方案2】:

我认为在这种情况下guava BiMap 是最好的选择。既然您不想使用它,那么您可以创建自己的集合 - TwoWayHashMap 类似这样的:

public class TwoWayHashmap<K extends Object, V extends Object> {

  private Map<K,V> forward = new Hashtable<K, V>();
  private Map<V,K> backward = new Hashtable<V, K>();

  public synchronized void add(K key, V value) {
    forward.put(key, value);
    backward.put(value, key);
  }

  public synchronized V getForward(K key) {
    return forward.get(key);
  }

  public synchronized K getBackward(V key) {
    return backward.get(key);
  }
}

访问attached link了解更多详情。

【讨论】:

  • OP 说他不能使用 Guava。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
相关资源
最近更新 更多