如何在Java中使用多图功能?

时间:2015-07-21 17:03:18

标签: java dictionary

我希望在Java中具有MultiMap的功能,提供与cpp MultiMap相同的功能,这样我就可以拥有多个具有相同值的键。容器中的多个元素可以具有等效键。我认为这会奏效:

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

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

如果您认为地图可以表示为,则上面的大小将报告为2,但也可以解释为5:

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

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

因此,可能的实施方式是实施Map<K, V>并使用支持Map<K, List<V>>。然后,您必须在遵循多图语义的同时实现各种方法。

如果您不关心语义但只想要将单个键映射到多个值,则可以直接使用Map<K, List<V>>并仍然得到您需要的内容。

答案 1 :(得分:0)

我认为在这种情况下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了解详情。