2015-07-21 44 views
1

我想在Java中具有MultiMap的功能,提供与cpp MultiMap相同的功能,以便我可以拥有多个具有相同值的键。容器中的多个元素可以具有相同的键。我认为这将工作:如何在Java中使用multimap功能?

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

任何帮助表示赞赏。

+0

番石榴具有multimaps的实现。 –

+0

也是Apache Commons。 http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html – markspace

+0

您是否需要使用相同的值映射多个键以及映射多个值用同样的钥匙? – Razib

回答

0

如果你想要一致的语义,你将不得不推出自己的。实现它的最简单方法是将其备份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>>,并且仍然可以获得所需的内容。

+0

但让我们看看一个场景,我想拥有相同值的多个键。有了这个实现,我必须搜索所有的值。比方说,A映射到[1,2,3],B映射到[2]。现在我想知道有2个值作为A和B的值。总而言之,这两种方式都不行。 – rt56

+0

@ rt56这是一个双映射,或者在这种情况下是一个双多映射,它不同于一般的多映射。为了实现这个目标,你必须保持价值和关键的支持。 –

+0

s/backing/mapping/ –

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了解更多详情。

+0

OP说他不能使用番石榴。 –