【问题标题】:Map with an error bar on key in java?在java中的键上带有错误栏的映射?
【发布时间】: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


【解决方案1】:

您正在使用哈希Map,因此地图插入调用hashCode 方法来确定项目应该在地图中的位置。 equals 仅在发生冲突时调用。

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

【讨论】:

  • 您对如何为我的场景覆盖 hashcode() 方法有什么建议吗?我应该以某种方式协调并为一系列键提供相同的整数,我不知道该怎么做。
  • 看起来不错,让我看一下。谢谢奥利弗。现在,我将其更改为 TreeMap 并且可以正常工作。
【解决方案2】:

我找到了解决方法。

  1. 我所做的是将HashMap&lt;&gt;更改为TreeMap&lt;&gt;

  2. NearestFreq

  3. 实现Comparable 接口
  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;
    }
    

它有效!

【讨论】:

  • 如果您有两个非常接近但超出范围的键,然后您尝试获取/放置位于这两个中间的另一个键,会发生什么?我认为您将根据树的当前形状获得随机结果。也许没关系,但需要考虑一些事情。
  • 感谢 bkail 的提醒。是的,我意识到了这个问题。但就我而言,这并不重要,因为我所拥有的分类中的间距远高于噪音水平。但是如果其他人知道他们是否遇到了这个问题,这是有好处的。
猜你喜欢
  • 2011-09-16
  • 2015-07-28
  • 2014-06-08
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多