问题:
我想在java中使用这样的地图:
Map<Double,List<MyClass>> map = new HashMap<Double,List<MyClass>>();
我想基本上根据double值对MyClass对象进行分组。
但Key(Double)是实验数据,它有噪音。我希望将项目添加到同一个列表中,即使密钥有点不同。
例如:
如果我已经在地图中有key = 1300.5
,如果我要添加的新值是newKey = 1300.7
,那么
当我说map.containsKey(newKey)
时,我希望地图返回true
当我说map.get(newKey)
时,我希望它返回key=1300.5
的相应列表值,然后我将添加一个新的MyClass
。
到目前为止我做了什么:
我创建了这个类,现在是我的密钥,而不是Double
class NearestFreq{
Double freq;
@Override
public boolean equals(Object obj) {
System.out.println("inside equals method...");
if(Math.abs(this.freq-((NearestFreq)obj).freq)<Constants.range){
return true;
}
else {
return false;
}
}
public NearestFreq(Double freq) {
super();
this.freq = freq;
}
}
我预计这会使地图假设两个键在误差栏内是相同的。我将地图更改为:
Map<NearestFreq,List<MyClass>> map = new HashMap<NearestFreq,List<MyClass>();
但我发现地图的containsKey()调用没有调用NearestFreq的.equals()
方法("inside equals method..."
从未打印过),我不明白为什么。
有谁能告诉我如何实现这个目标?
答案 0 :(得分:2)
您正在使用哈希地图,因此地图插入调用hashCode
方法来确定项目应该在地图中的位置。只有在发生碰撞时才会调用equals
。
作为Java中的一般规则,如果您覆盖equals
或hashCode
,则应始终覆盖另一个,以确保a.hashCode() == b.hashCode()
如果a.equals(b)
为真。< / p>
答案 1 :(得分:1)
我找到了解决方法。
我所做的是将HashMap<>
更改为TreeMap<>
为Comparable
和
NearestFreq
界面
将compareTo方法覆盖为:
@Override
public int compareTo(NearestFreq o) {
if(Math.abs(this.freq-((NearestFreq)o).freq)<range){
return 0;
}
else if((this.freq-((NearestFreq)o).freq) <0) {
return -1;
}
else if((this.freq-((NearestFreq)o).freq) >0) {
return 1;
}
return 0;
}
它有效!