在java中散列多个键的最佳方法

在java中散列多个键的最佳方法,java,hashmap,Java,Hashmap,我有一组四个数字,它们一起组成一把钥匙。因此,它们的唯一组合应该对应一个值。为此目的准备hashmap的最佳方法是什么。这些选择包括: 1) 通过将它们连接成字符串来生成唯一键 2) 通过将它们相加来生成一个唯一的密钥(将其中一些密钥乘以10的幂以避免重复)。 3) 创建一个以四个数字作为字段的类,并散列该类的一个实例 如果是第三种,我不知道如何实现这种方法(假设它是可能的)。下面的代码应该打印2,但不打印任何内容 AdjFactor a = new AdjFactor(2,3,4,5);

我有一组四个数字,它们一起组成一把钥匙。因此,它们的唯一组合应该对应一个值。为此目的准备hashmap的最佳方法是什么。这些选择包括:

1) 通过将它们连接成字符串来生成唯一键 2) 通过将它们相加来生成一个唯一的密钥(将其中一些密钥乘以10的幂以避免重复)。 3) 创建一个以四个数字作为字段的类,并散列该类的一个实例

如果是第三种,我不知道如何实现这种方法(假设它是可能的)。下面的代码应该打印2,但不打印任何内容

 AdjFactor a = new AdjFactor(2,3,4,5);
    AdjFactor b = new AdjFactor(3,3,4,5);
    HashMap<AdjFactor,Double> factrs = new HashMap<>();
    factrs.put(a, 1d);
    factrs.put(b, 2d);
    AdjFactor c = new AdjFactor(1,3,4,5);
    AdjFactor d = new AdjFactor(3,3,4,5);
    if(factrs.containsKey(c)){
        System.out.println(factrs.get(c));
    }
    if(factrs.containsKey(d)){
        System.out.println(factrs.get(d));
    }
下面的代码应该打印2,但不打印任何内容

 AdjFactor a = new AdjFactor(2,3,4,5);
    AdjFactor b = new AdjFactor(3,3,4,5);
    HashMap<AdjFactor,Double> factrs = new HashMap<>();
    factrs.put(a, 1d);
    factrs.put(b, 2d);
    AdjFactor c = new AdjFactor(1,3,4,5);
    AdjFactor d = new AdjFactor(3,3,4,5);
    if(factrs.containsKey(c)){
        System.out.println(factrs.get(c));
    }
    if(factrs.containsKey(d)){
        System.out.println(factrs.get(d));
    }
这是因为您的
AdjFactor
类没有实现
.equals()
.hashCode()

因此,它使用
对象的默认值;一个
对象
.equals()
另一个对象,当且仅当它们是完全相同的引用时

==>为您的类实现
.equals()
.hashCode()

,供你阅读。如果您使用Java 7,请查看可以帮助您的
对象

编辑示例实现:

public class AdjFactor 
{
    // ....
    @Override
    public int hashCode()
    {
        return demo ^ month ^ year ^ site;
    }

    @Override
    public boolean equals(final Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final AdjFactor other = (AdjFactor) obj;
        return demo == other.demo
            && month == other.month
            && year == other.year
            && site == other.site;
    }
}

关于hashcode的问题,你会同意的

Arrays.hashCode(new int[] { demo, month, year, site });

你能发布AdjFactor类的结构吗?你所说的
最佳方式是什么意思?
?内存是最重要的,其次是速度;不要忘记实现
.equals()
.hashCode()
!对于3,我需要一个.contains()等价项。上面的(默认)不起作用。你能告诉我如何实现它们吗?我试着实现equals-呃,有很多链接会告诉你。。。无论如何都要编辑。使用
java.util.Objects.hash
可以获得更好的哈希函数。恐怕我需要详细说明。代码是什么样子的?只需在
hashCode()方法中返回它即可