我正在尋找一種方法來存儲鍵值對。我需要查找是雙向的,但同時我需要爲同一個密鑰存儲多個值。換句話說,像BidiMap這樣的東西,但是對於每個鍵都可以有多個值。例如,它需要能夠保存像「s1」 - > 1,「s2」 - > 1,「s3」 - > 2這樣的對,並且我需要能夠將值映射到每個鍵,並且對於每個值,獲取與其關聯的所有密鑰。Java中的雙向多值映射
回答
所以你需要支持多對多的關係嗎?最近你可以得到Guava的Multimap
就像@Mechkov寫的 - 但更具體地說Multimap
組合Multimaps.invertFrom
。 「BiMultimap」尚未實現,但在Google Guava庫中請求此功能的an issue。
在這一點上,你有幾種選擇:
如果你的「BiMultimap」將不可變不變 - 使用
Multimaps.invertFrom
和ImmutableMultimap
/ImmutableListMultimap
/ImmutableSetMultimap
(每個theese三個具有不同的收集保存的值)。某些代碼(例如,從應用程序開發我取,使用Enum
S和Sets.immutableEnumSet
):如果你真的想你Multimap之要修改,這將是難以維持兩個K-> V與V-> K變體,除非您每次需要修改
kToVMultimap
並致電invertFrom
(並且使該副本不可修改,以確保您不小心不會修改vToKMultimap
什麼不會更新kToVMultimap
)。這不是最佳的,但應該在這種情況下。(不是你的情況可能是,提到獎金):
BiMap
接口和實現類具有.inverse()
方法,給出了從BiMap<K, V>
BiMap<V, K>
視圖和自身biMap.inverse().inverse()
後。如果我之前提到的this issue完成了,它可能會有類似的東西。(編輯2016年10月)您也可以使用new graph API這將是目前在Guava 20:
作爲一個整體,共同的。圖形支持的以下品種圖:
- 向圖
- 無向圖
- 節點和/或邊緣與相關聯的值(權重,標籤等)
- 圖表,做/不允許自循環
- 圖表,做/不允許平行的邊緣(與平行邊緣圖有時被稱爲多重圖)
- 圖的節點/邊緣插入順序,分類或無序
希望我把你的右
class A {
long id;
List<B> bs;
}
class B {
long id;
List<A> as;
}
谷歌的Guava MultiMap實現是我用於這些目的。
Map<Key Collection<Values>>
其中Collection可以是一個ArrayList例如。它允許存儲在一個集合中的多個值映射到一個鍵。 希望這有助於!
不是雙向的。 – Stefan
我希望用MultivaluedMap解決了這個問題。 請從oracle下面的鏈接找到文檔。
http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MultivaluedMap.html
這是一個界面。有沒有實現? – amoebe
使用谷歌番石榴,我們可以如下編寫原始BiMulitMap。
import java.util.Collection;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class BiMultiMap<K,V> {
Multimap<K, V> keyToValue = ArrayListMultimap.create();
Multimap<V, K> valueToKey = ArrayListMultimap.create();
public void putForce(K key, V value) {
keyToValue.put(key, value);
valueToKey.put(value, key);
}
public void put(K key, V value) {
Collection<V> oldValue = keyToValue.get(key);
if (oldValue.contains(value) == false) {
keyToValue.put(key, value);
valueToKey.put(value, key);
}
}
public Collection<V> getValue(K key) {
return keyToValue.get(key);
}
public Collection<K> getKey(V value) {
return valueToKey.get(value);
}
@Override
public String toString() {
return "BiMultiMap [keyToValue=" + keyToValue + ", valueToKey=" + valueToKey + "]";
}
}
希望這將有助於雙向多地圖的一些基本需求。 請注意K和V需要正確實施hascode和equals方法
- 1. Java中的雙向映射?
- 2. 一對多雙向映射
- 3. 雙向多對一映射
- 4. 雙向映射
- 5. 雙向映射
- 6. 雙向映射
- 7. PHP雙向映射
- 8. AutoMapper雙向映射
- 9. Python雙向映射
- 10. 雙向/反向映射
- 11. 休眠多對多使用Java列表雙向映射
- 12. Boost :: Bimap相當於雙向多映射
- 13. 映射雙向一對多Hibernate實體
- 14. 傑克遜雙向映射
- 15. 雙向映射列表
- 16. 雙向映射同步
- 17. 雙向一對多/多對一映射OpenJPA中JPQL問題
- 18. NHibernate雙向多對多映射的2個列表
- 19. 帶有子類型的雙向多對多JPA映射
- 20. 休眠映射:在休眠時刪除一對多的雙向映射
- 21. Solidity中的多值映射
- 22. 如何在java中創建雙向映射
- 23. 如何在Java中將雙向實體映射到DTO
- 24. 代碼的雙向NHibernate映射
- 25. 具有非唯一值的多映射的反向/反向映射
- 26. 雙向或單向多對一doctrine2關聯映射
- 27. NHIbernate雙向多對多映射插入更新問題
- 28. NHibernate雙向多對多映射列表/包
- 29. 通過代碼NHibernate映射 - 多對多 - 雙向導航
- 30. 休眠雙向多對多映射建議!
您提到每個鍵需要多個值,但在您的示例中,您沒有具有多個值的鍵,而是具有兩個鍵的值。你應該澄清一點。如果你的例子適合你的問題,你會得到更好的答案;-) – pushy
http://www.jguru.com/faq/view.jsp?EID=1317828在這裏你可以找到如何創建multimap – maks
@pushy,同樣的問題,如果我反轉地圖,並保留整數作爲鍵而不是值,我會得到一對多的映射。無論如何,感謝您的更正。 :) –