有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

HashMapJava中的密钥

在Java中使用HashMap时,我通常会遇到如下场景:

我有一个a类对象的列表(List<A>
A有int f1、int f2和其他字段

我必须从列表中构造一个映射来执行a对象的O(1)查找。关键是f1和f2的组合(两者都是整数)

现在,以下哪项是地图的最佳实践
案例1:一般情况下
情况2:f2只能获取2到3个不同的值,而f1可以获取大量的值

Map<Integer, Map<Integer, List<A>>>  // construction of map is cumbersome
Map<String, List<A>>                 //(key : String f1 + "_" + f2)
Map<Integer, List<A>>          //(I tend to use this for case 2)

这里没有澄清一件事。f1和f2不能唯一标识A的对象。已更正贴图定义


共 (5) 个答案

  1. # 1 楼答案

    如果这两个字段往往是不可变的(一旦设置,它们就不会更改),则可以重写A的equals()hashCode()方法,只需存储A:

    Set<A>    //(key: fields f1 and f2, via hashCode() method)
    

    如果它们不是不可变的,那么无论如何都不能将它们用作密钥,因为它们可能会更改

  2. # 2 楼答案

    密钥在HashMap中是唯一的。。。因为java内部的密钥设置为

    final Key
    

    java中的int静态入口类

    这就是为什么密钥是唯一的它不允许重复

  3. # 3 楼答案

    我不喜欢使用字符串作为复合键。一些博主说得很好:字符串对文本内容有好处,但对非文本内容没有好处

    为什么不创建一个简单的IntPair类,其中包含两个int字段,以及适当的hashCode()equals(Object)重写?在IDE中只需两秒钟(没有IDE的时间不会太长),就可以得到一个更具体、语义上更有意义的键类型

  4. # 4 楼答案

    我认为Map适用于case 1,对于case,我推荐List,这个列表只有2-3个元素,然后你可以将索引映射到特定的字段值

  5. # 5 楼答案

    为什么要用地图?如果你真的不需要键值对,你可以使用HashSet<A>。查找仍然是O(1),您不必费心从键中获取值

    当然,HashSet可能只是一个具有空值的HashMap,但您不必发明键和值