我应该在TreeMap中使用Double作为键吗?

时间:2012-07-26 19:20:56

标签: java sorting collections treemap

Double in HashMap的答案中所述,双打不应该用在HashMaps中,因为它们很难比较相等。我相信我的情况有所不同,但我想我会要求确认,因为我没有看到任何相关内容。

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

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

4 个答案:

答案 0 :(得分:14)

  

不应在HashMaps中使用双打,因为它们难以比较相等。

  • 您是否会尝试get基于某些键的值?

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

    • 如果没有(即您通常只会执行for (Double key : map.keySet()) ...或迭代entrySet),那么我会说您使用{{1作为键。

  

双值会产生一堆数学,因此重复值的可能性非常低。

  • 如果您实际重复出现错误吗?

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

    • 如果没有,(即它映射到的两个值中的哪一个无关紧要,因为它们只能以小epsilon的不同为准),那么你应该没事。< / p>

答案 1 :(得分: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上的此片段。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

如果您想通过密钥直接访问项目,请仅使用地图和表格。