Vah*_*idB 1 scala contains exists hashmap
var surfaceMap = Map[Surface, Array[Event]]()我在 Scala 中有一张地图,其中Surface类表示由平面组成的几何表面。在Surface类中我定义equals方法如下:
final override def equals(other: Any): Boolean = other match {
case that: Surface => (planes.deep == that.planes.deep)
case _ => false
}
final override def hashCode: Int = planes.##
Run Code Online (Sandbox Code Playgroud)
等式检查构成曲面的所有平面是否具有相同的坐标。我有一个包含 8 个元素的 surfaceMap,当我想将 an 添加Event到地图中已有的表面时,当我检查键是否存在时,surfaceMap.contains(newSurface)它返回 false,但当我使用surfaceMap.exists(_._1 == newSurface)or时surfaceMap.keySet.exists(_ == newSurface),它需要更长的时间并返回 true。我认为.contains()和.keySet.exists()做同样的工作,但似乎它们是不同的,但我不明白其中的区别。任何帮助表示赞赏。
Map.keySet.exists不做与Map.contains,相同的事情Map.keySet.contains。
不同之处在于,.contains使用对象的哈希码(前提是我们使用默认的 HashMap 实现)来快速导航到您要查找的键。这是一个常数时间 ( O(1)) 操作。
.exists不能这样做,因为它正在寻找任意条件,而不是精确的对象。因此,它必须扫描整个集合并评估每个元素的条件,直到找到匹配的元素。这是一个线性时间 ( O(N)) 运算。
至于为什么Map.contains在您的情况下返回 false,那一定是因为您的hashCode实现不正确:您正在使用默认的 . ##,对于不同的实例,即使它们包含相同的值(除非它是一个案例类),它也会有所不同。
| 归档时间: |
|
| 查看次数: |
3823 次 |
| 最近记录: |