【问题标题】:How to use doubles as keys in Java如何在 Java 中使用 double 作为键
【发布时间】:2014-09-05 14:57:56
【问题描述】:

我有一个代表身体轨迹的 csv 数据文件。格式为 t、x、y、x。我想将该粒子的历史存储在一种 HashMap 中,以便在给定时间轻松访问坐标,而无需每次都读取文件。我担心键和值是对象,而不是原始类型。那么,做这样的事情是个好主意吗?例如,我假设要填充 HashMap,必须全局定义 Doubles,以便为连续访问明确定义它们的地址......对吗?

【问题讨论】:

  • 是的,你可以使用 Double 作为键...
  • 您始终可以使用 Double 作为键。但是,可能存在精度问题。如果您的地图中有一个值为 0.00001 的键,并且您想知道键 0.000099 是否存在怎么办?
  • 一般时间用long值表示。由于您有兴趣按时间查找坐标,因此您的键将是 Long,而不是 Double
  • 您的问题需要更多细节(地图中有什么?)如果您使用 BigDecimal 而不是 double,您将不会遇到精度问题。 docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
  • @tom 打扰一下,精度是个问题...谢谢!

标签: java hashmap key double


【解决方案1】:

除了IdentityHashMap 之类的标识映射之外,映射使用equals() 方法来检查键是否相等。

因此,您可以使用不同的实例,只要它们是由 equals() 方法的语义定义的“相等”(对于哈希映射,只要 hashcode 方法与 equals 一致)。 . 并且双重尊重这两个要求,所以Double 可以。

但是,双精度数会损失精度,因此如果您使用通过某种计算获得的双精度数,它们的小数可能会有所不同(例如 8.999999 和 9,只是为了让您理解),这可以使地图无法正常工作。

【讨论】:

  • 谢谢!范围问题呢?如果我在 while 循环中填充地图,并且当程序退出时在循环中创建双精度对象,它会破坏对象,因为它们超出范围,对吗?
  • 如果在map中作为key使用,map会有对它们的引用,所以只要map不超出范围,即使退出循环也不会松动他们..如果这是你要问的。
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多