我有一组四个数字,它们组成一个键。因此,它们的独特组合应该对应导致一个值。为此目的准备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;
}
}
答案 0 :(得分:2)
下面的代码应该打印2,但不打印任何内容。
这是因为您的AdjFactor
课程没有实施.equals()
和.hashCode()
......
因此,它使用Object
的默认值;和Object
.equals()
另一个当且仅当它们完全相同时才会引用!
==&GT;为您的班级实施.equals()
和.hashCode()
Obligatory,Javadoc,links供您阅读。如果您使用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 });