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