2012-07-26 95 views
8

正如在Double in HashMap的答案中所述,不应该在HashMaps中使用双精度,因为它们难以进行平等比较。我相信我的情况是不同的,但我想我会要求确保,因为我没有看到任何关于此事的信息。我应该在TreeMap中使用Double作为键吗?

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

编辑:我应该澄清一点:我需要的是让这个对象列表按照与它们相关的双打排序。双打的值将被放弃,我永远不会叫map.get(key)

+0

听起来你应该是安全的。您可能会添加一些欺骗性因素处理,以防止重复发生,以防万一。 – Wug 2012-07-26 19:24:23

回答

13

双打不应该包含HashMap中使用,因为他们是很难比较平等。

  • 将你曾经尝试get值基础上的某些键?

    • 如果,则关于“难以比拟”的道理也适用,你或许应该避免这样的数据结构(或总是依靠tailMap/headMap/submap并获取地图的范围)。

    • 如果没有(即您通常只是做for (Double key : map.keySet()) ...或遍历entrySet),那么我将你没事使用Double作为键说。

双值生成一束的数学,所以重复的值的可能性极低。

  • 它是一个错误如果你真的得到重复?

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

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

+0

这是完美的。我的两个答案都是“不”,所以我很好走。 – MalcolmOcean 2012-07-26 19:50:01

1

在树图双打的问题是完全一样的,因为它是在哈希表双打 - 平等比较。如果您避免拨打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这个片段。

0

如果您只是希望它们排序,那么会有更好的集合(例如SortedSet)。你也可以使用任何列表并使用公用事业进行排序(我认为他们在java.util.Collection)。

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

1

如果你只是想对它们进行排序,最好的事情是创建一个围绕双和对象的包装对象,实现对这个包装的“可比”的界面,并使用一个简单的收集整理他们

相关问题