在Java中的键上映射错误栏?

时间:2015-05-11 00:38:31

标签: java dictionary

问题:

我想在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..."从未打印过),我不明白为什么。

有谁能告诉我如何实现这个目标?

2 个答案:

答案 0 :(得分:2)

您正在使用哈希地图,因此地图插入调用hashCode方法来确定项目应该在地图中的位置。只有在发生碰撞时才会调用equals

作为Java中的一般规则,如果您覆盖equalshashCode,则应始终覆盖另一个,以确保a.hashCode() == b.hashCode()如果a.equals(b)为真。< / p>

答案 1 :(得分:1)

我找到了解决方法。

  1. 我所做的是将HashMap<>更改为TreeMap<>

  2. Comparable

  3. 实施NearestFreq界面
  4. 将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;
    }
    
  5. 它有效!