【问题标题】:using Float numbers for the map's key使用浮点数作为地图的键
【发布时间】:2011-05-13 04:16:04
【问题描述】:
创建新对象后:Map<Float,Integer> m = new HashMap()<Float,Integer>;
我有一个带有 "float" 数字的数组,它们是唯一的。我想将这些浮点数添加为m's key!我可以这样做吗:m.put(new Float(a[i]),"cat");?
谢谢
【问题讨论】:
标签:
java
algorithm
hashmap
【解决方案1】:
如果可能,我建议不要使用浮点数作为哈希映射键。查找值时,您的键必须完全匹配,并且很容易得到不完全正确的浮点数。
【解决方案2】:
只是把所有的答案放在一起。
- 提到的 Map 不能接受字符串,所以不能说 m.put(f, "cat")
- 您可以但不必使用 Float 包装浮动:自动装箱会自动为您完成,因此您只需说 m.put(a[i],"cat")
- 不建议您使用浮点类型(Float 和 Double)作为映射键。当您尝试使用 get(key) 方法从地图中提取值时,可能会导致问题
- 还要注意,浮动常量的默认类型是双精度,而不是浮点。所以,小心浮动,只有当你真的需要它们时才使用它们。在任何情况下,在 3.14f 等常量附近使用浮点修饰符。
【解决方案3】:
您不能使用m.put(new Float(a[i]),"cat");,因为您的值必须是Integer。为此,您必须将其声明为 Map<Float,String> m = new HashMap()<Float,String>;。
【解决方案4】:
截断到给定的精度以根据浮点数生成可预测的键。 JavaScript 中的示例
const precision = Math.pow(10, 4); // where 4 is number of decimal places to retain
const a = 12.5678912331; b = 13.75324122; c = 21.32112221
const key = '' + Math.floor(a * precision) + '_' + Math.floor(b * precision) + '_' + Math.floor(c * precision);
const aMap = new Map();
aMap.set(key, 'some value');
无用的事实:这取自用于索引 3d 对象中的顶点的代码。通过设置较低的精度,它允许合并附近的顶点