如何解决在Java中使用二维键进行映射
| 我想要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<K1,Map<K2,V>>
Map<Pair<K1,K2>,V>
其他?
(其中K1,K2,V分别是第一键,第二键和值的类型)
解决方法
您应该使用
Map<Pair<K1,K2>,V>
它只会包含一张地图,
而不是N + 1个地图
重点建设
将是显而易见的(
对)
没有人会感到困惑
地图的意义
面向API的程序员不会改变。
数据结构中的停留时间会更短,如果您发现需要稍后进行同步,那么这会很好。
, 如果您愿意引入一个新的库(我建议这样做),请查看Guava中的Table。这实际上可以完全满足您的需求,还可以添加一些功能,使您可能希望所有与两个键之一匹配的条目。
interface Table<R,C,V>
集合与
有序键对,称为行键
和一个具有单个值的列键。
一个表可能是稀疏的,只有一个
行键/列键的一小部分
对具有相应
值。
, 我建议选择第二种选择
Map<Pair<K1,V>
第一个在检索数据时会产生更多的重载,在从Map中插入/删除数据时甚至会产生更多的重载。每次您输入新的值V时,都需要检查K1的地图是否存在,如果不创建,请将其放置在主地图中,然后将值与K2一起放置。
如果要在初次公开时具有接口,请使用您自己的\“ DoubleKeyMap \”将wrap6ѭ包装起来。
(并且不要忘记在Pair类中正确实现方法hash和equals!)
, 我选择“ 2”解决方案,因为:
它直接表达了你想做什么
可能会更快,因为它使用更少的间接
简化客户端代码(此后使用Map
的代码
, 从逻辑上讲,您对(key1,key2)对应于某物,因为它是地图的键。因此,您可以考虑编写自己的以K1和K2作为参数的类,并覆盖hashCode()方法(可能还有其他方法以方便使用)。
显然,这似乎是解决问题的“干净”方法。
, 虽然我也支持您的建议(一对值用作键),但您也可以考虑制作一个可以容纳/匹配两个键的包装器。这可能会使您感到困惑,因为您将需要重写equals和hashCode方法并使该方法起作用,但是这可能是一种直接的方法,用于向使用您的代码的下一个人表明密钥必须是特殊类型。
经过一番搜索,我发现了这篇帖子可能对您有用。特别是在Apache Commons集合之外,MultiKeyMap。我以前从未使用过它,但是它看起来像是一个不错的解决方案,可能值得探讨。
, 我使用数组作为键:像这样
Map<Array[K1,K2],V>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。