9

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

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

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

4

4 回答 4

14

Doubles 不应该在 HashMaps 中使用,因为它们很难比较是否相等。

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

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

    • 如果不是(即您通常只做for (Double key : map.keySet()) ...或迭代entrySet),那么我会说您可以使用Doubleas 键。

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

  • 如果您确实得到了副本,这是一个错误吗?

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

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

于 2012-07-26T19:24:06.750 回答
2

树形映射中双精度的问题与哈希映射中的双精度完全相同 - 比较是否相等。如果您避免调用 oftreeMap.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上的此片段。

于 2012-07-26T19:24:59.353 回答
1

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

于 2012-07-26T19:35:37.560 回答
0

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

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

于 2012-07-26T19:25:11.630 回答