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

时间:2014-02-26 02:23:57

标签: java hashmap

我有一组四个数字,它们组成一个键。因此,它们的独特组合应该对应导致一个值。为此目的准备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));
    }

这是我的AdjFactor类 -

public class AdjFactor {
public int demo;
public int month;
public int year;
public int site;

AdjFactor(int demo1,int month1,int year1,int site1){
    this.demo = demo1;
    this.month = month1;
    this.year = year1;
    this.site = site1;
 }
public boolean equals(AdjFactor a, AdjFactor b){
    if(a.demo==b.demo && a.month==b.month && a.year==b.year && a.site==b.site)return true;
    else return false;
}
}

2 个答案:

答案 0 :(得分:2)

  

下面的代码应该打印2,但不打印任何内容。

这是因为您的AdjFactor课程没有实施.equals().hashCode() ......

因此,它使用Object的默认值;和Object .equals()另一个当且仅当它们完全相同时才会引用!

==&GT;为您的班级实施.equals().hashCode()

ObligatoryJavadoclinks供您阅读。如果您使用Java 7,请查看可以帮助您的Objects类。

编辑示例实施:

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;
    }
}

答案 1 :(得分:1)

关于哈希码问题,你可以使用

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