【发布时间】:2015-05-11 00:38:30
【问题描述】:
问题:
我想在 java 中有这样的地图:
Map<Double,List<MyClass>> map = new HashMap<Double,List<MyClass>>();
我想基本上基于双值对 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>();
但我发现 map 的 containsKey() 调用没有调用 NearestFreq 的 .equals() 方法("inside equals method..." 从未打印),我不明白这是为什么。
谁能告诉我如何做到这一点?
【问题讨论】:
-
当您提供
equals时,您还必须提供匹配的hashCode(尤其是当您想在HashMap 中使用它时)。但我不认为这可以那样工作。所有值都需要相等才能满足传递条件(您可以在任何两个 Double 之间构建一个非常接近的 Double 的长链)。您可以尝试预先定义一些桶(例如四舍五入到最接近的整数)。 -
@Thilo 问题是噪声会有几个整数宽,现在是 -5
标签: java dictionary