我想在Java中具有MultiMap的功能,提供與cpp MultiMap相同的功能,以便我可以擁有多個具有相同值的鍵。容器中的多個元素可以具有相同的鍵。我認爲這將工作:如何在Java中使用multimap功能?
TreeMap<Key, TreeMap<Key, Value> >.
任何幫助表示讚賞。
我想在Java中具有MultiMap的功能,提供與cpp MultiMap相同的功能,以便我可以擁有多個具有相同值的鍵。容器中的多個元素可以具有相同的鍵。我認爲這將工作:如何在Java中使用multimap功能?
TreeMap<Key, TreeMap<Key, Value> >.
任何幫助表示讚賞。
如果你想要一致的語義,你將不得不推出自己的。實現它的最簡單方法是將其備份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>>
,並且仍然可以獲得所需的內容。
但讓我們看看一個場景,我想擁有相同值的多個鍵。有了這個實現,我必須搜索所有的值。比方說,A映射到[1,2,3],B映射到[2]。現在我想知道有2個值作爲A和B的值。總而言之,這兩種方式都不行。 – rt56
@ rt56這是一個雙映射,或者在這種情況下是一個雙多映射,它不同於一般的多映射。爲了實現這個目標,你必須保持價值和關鍵的支持。 –
s/backing/mapping/ –
我認爲在這種情況下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說他不能使用番石榴。 –
番石榴具有multimaps的實現。 –
也是Apache Commons。 http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html – markspace
您是否需要使用相同的值映射多個鍵以及映射多個值用同樣的鑰匙? – Razib