2015-07-21 72 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說他不能使用番石榴。 –