【问题标题】:Should I use Double as keys in a TreeMap?我应该在 TreeMap 中使用 Double 作为键吗?
【发布时间】:2012-07-26 19:20:56
【问题描述】:

正如Double in HashMap 的回答中所述,在 HashMaps 中不应使用 Double,因为它们很难比较是否相等。我相信我的情况有所不同,但我想我会要求确认一下,因为我没有看到任何关于此的内容。

我将有一系列与对象关联的双精度值,我希望它们按双精度值排序。 TreeMap 是一个合适的解决方案吗?会有更好的吗?双精度值是由一堆数学生成的,因此重复值的可能性极低。

编辑:我应该澄清一下:我需要的只是让这个对象列表按它们关联的双打排序。双打的值将被丢弃,我永远不会打电话给map.get(key)

【问题讨论】:

  • 听起来你应该是安全的。您可以添加一些软糖因素处理,以防止重复发生,以防万一。

标签: java sorting collections treemap


【解决方案1】:

不应该在 HashMap 中使用双精度数,因为它们很难比较是否相等。

  • 你会尝试get基于某些键的值吗?

    • 如果,那么关于“难以比较”的推理适用,您可能应该避免这种数据结构(或始终依赖tailMap / headMap / submap并获取地图的范围)。

    • 如果 no(即您通常只执行 for (Double key : map.keySet()) ... 或遍历 entrySet),那么我会说您可以使用 Double 作为键。

double 值是由一堆数学生成的,所以重复值的可能性极低。

  • 如果您确实确实得到了重复,这是否是一个 错误

    • 如果,那么它不是正确的数据结构。例如,您可以使用来自 Guava 的 Multimap

    • 如果 no,(即映射到两个值中的哪一个并不重要,因为它们无论如何只能相差一个小 epsilon),那么你应该没问题。

【讨论】:

  • 这是完美的。我的两个答案都是“不”,所以我很高兴。
【解决方案2】:

树形映射中双精度的问题与哈希映射中双精度的问题完全相同——比较是否相等。如果您避免调用treeMap.get(myDouble) 而是继续使用范围查询(例如使用submap),您应该没问题。

TreeMap<Double,String> tm = new TreeMap<Double,String>();
tm.put(1.203, "quick");
tm.put(1.231, "brown");
tm.put(1.233, "fox");
tm.put(1.213, "jumps");
tm.put(1.243, "over");
tm.put(1.2301, "the");
tm.put(1.2203, "lazy");
tm.put(1.2003, "dog");
for (Map.Entry<Double,String> e : tm.subMap(1.230, 1.232).entrySet()) {
    System.out.println(e);
}

打印出来

1.2301=the
1.231=brown

ideone 上查看这个 sn-p。

【讨论】:

    【解决方案3】:

    如果你只想对它们进行排序,最好的办法是围绕双精度和对象创建一个包装器对象,在这个包装器上实现“可比较”接口,并使用一个简单的集合对它们进行排序

    【讨论】:

      【解决方案4】:

      如果您只想对它们进行排序,还有更好的集合(例如SortedSet)。您还可以使用任何列表并使用实用程序进行排序(我认为它们在 java.util.Collection 中)。

      仅当您想通过键直接访问项目时才使用地图和表格。

      【讨论】:

        猜你喜欢
        • 2016-05-10
        • 1970-01-01
        • 2017-04-16
        • 2017-04-22
        • 1970-01-01
        • 2013-01-19
        • 2011-12-22
        • 1970-01-01
        • 2014-12-05
        相关资源
        最近更新 更多