如Double in HashMap的答案中所述,双打不应该用在HashMaps中,因为它们很难比较相等。我相信我的情况有所不同,但我想我会要求确认,因为我没有看到任何相关内容。
我将要有一系列与对象关联的double值,我希望它们按double值排序。 TreeMap是一个合适的解决方案吗?会有更好的吗? double值是一堆数学生成的,因此重复值的可能性非常低。
编辑:我应该澄清一下:我所需要的就是让这个对象列表按照它们所关联的双打来排序。双打的值将被丢弃,我永远不会打电话给map.get(key)
答案 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
)。
如果您想通过密钥直接访问项目,请仅使用地图和表格。