java中的二维键映射
我想要一个Java中由两个键索引的映射(一个使用两个键放置和检索值的映射)。为了清楚起见,我正在寻找以下行为:java中的二维键映射,java,hash,map,Java,Hash,Map,我想要一个Java中由两个键索引的映射(一个使用两个键放置和检索值的映射)。为了清楚起见,我正在寻找以下行为: map.put(key1, key2, value); map.get(key1, key2); // returns value map.get(key2, key1); // returns null map.get(key1, key1); // returns null 最好的方法是什么?更具体地说,我应该使用: Map Map 其他的 (其中K1、K2、V分别是第一个
map.put(key1, key2, value);
map.get(key1, key2); // returns value
map.get(key2, key1); // returns null
map.get(key1, key1); // returns null
最好的方法是什么?更具体地说,我应该使用:
Map
Map
- 其他的
Map
我会选择
Map
解决方案,因为:
- 它直接表达了你想做什么
- 可能更快,因为它使用更少的间接寻址
- 简化客户端代码(之后使用
映射的代码
Map<Pair<K1,K2>,V>
Map
第一种方法在检索数据时会产生更多重载,在从映射中插入/删除数据时会产生更多重载。每次输入新值V时,都需要检查K1的映射是否存在,如果不存在,则创建它并将其放入主映射中,然后将值与K2一起输入
如果您想在公开时拥有一个界面,请首先使用您自己的“DoubleKeyMap”包装您的映射
(别忘了在这对类中正确地实现哈希和等值!!)/P>< P>逻辑上,你的对(KE1,KE2)对应于某个东西,因为它是你的地图的关键。因此你可以考虑把你自己的K1和K2类写为参数并重写HASCODE()方法。(为了更方便,可能还需要其他方法)。
这显然是一种“干净”的方法来解决您的问题。如果您愿意引入一个新的库(我推荐),请查看in。这实际上正是您想要的,也可能添加一些功能,您可能需要与两个键中的一个匹配的所有条目
interface Table<R,C,V>
接口表
一个与一个主题相关联的集合
一对有序的键,称为行键
和一个列键,具有单个值。
一个表可能是稀疏的,只有一个
行键/列键的一小部分
具有对应关系的对
价值观
而我也同意你的建议(一对用作关键的值)你也可以考虑制作一个可以保存或匹配两个键的包装器。这可能会有点混乱,因为你需要重写等值和哈希德方法并使之有效,但是它可以是一个直接的方式,用代码告诉下一个人该键必须是一个特殊类型。
搜索一下,我发现了可能对您有用的方法。特别是在Apache Commons集合中,。我以前从未使用过此方法,但它看起来是一个不错的解决方案,可能值得探索。我使用数组作为密钥:像这样
Map
难道你不能只拥有一个由两个值组成的键吗?@Adrian:这不是Map
所能做的吗?从技术上讲只有一个键,但它由两个值组成。@Adrian是的,这就是我在第二个选项中的意思。我正在使用“apache commons”lib。有人知道“Pair”类是否可以工作吗?(我的意思是,如果它在这种情况下实现了hashCode并正确地等于?)哈希不一定是完美的,一个好的方法是实现您自己的对。hashCode()
方法可以只返回a.hashCode()或b.hashCode().但这不是每次我们在doubleMap中搜索某个对象时都为pair对象分配内存吗?我的意思是,它更干净,但如果我们谈论的是一个静态数据的大地图,这个解决方案不是设计得很糟糕吗?如果你担心每次搜索时分配内存,那么使用哪种类型的地图并不重要因为映射并不是真正的核心问题。您可能希望工厂生成备份到唯一密钥存储的密钥,以便生成两个密钥的两个请求两次返回同一个对象。这与成对映射问题无关,考虑到哈希数组,映射映射可能会占用更多存储空间(1 vs 1*M,在一个M*N示例中)以及它们都必须维护的桶列表。是的,您可以使用HashBasedTable
实现有趣的是,这在内部使用了Map方法。