我正在寻找一种方法来存储键值对。我需要查找是双向的,但同时我需要为同一个密钥存储多个值。换句话说,像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,同样的问题,如果我反转地图,并保留整数作为键而不是值,我会得到一对多的映射。无论如何,感谢您的更正。 :) –