Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的二维键映射_Java_Hash_Map - Fatal编程技术网

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分别是第一个

我想要一个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

  • 它将只包含一个地图, 而不是N+1贴图

  • 重点建设 将是显而易见的(创建 配对)

  • 没有人会对这个问题感到困惑 地图的意义是它的 面向API的程序员不会改变

  • 数据结构中的驻留时间会更短,如果您发现以后需要同步它,这是很好的


  • 我会选择
    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方法。