Scala 地图中 .contains() 和 .keySet.exists() 的区别
difference between .contains() and .keySet.exists() in Scala Maps
我在 Scala 中有一张地图 var surfaceMap = Map[Surface, Array[Event]]()
,其中 Surface
class 表示由平面组成的几何表面。在 Surface class 中,我定义 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.##
等式检查构成曲面的所有平面是否具有相同的坐标。我有一个包含 8 个元素的 surfaceMap,当我想将 Event
添加到地图中已有的表面时,当我使用 surfaceMap.contains(newSurface)
检查密钥是否存在时,它 returns false但是当我使用 surfaceMap.exists(_._1 == newSurface)
或 surfaceMap.keySet.exists(_ == newSurface)
时,它需要更长的时间并且 returns 是正确的。我以为 .contains()
和 .keySet.exists()
做同样的工作,但看起来它们是不同的,但我不明白其中的区别。任何帮助表示赞赏。
Map.keySet.exists
与 Map.contains
、Map.keySet.contains
做的事情不同。
区别在于.contains
使用对象的哈希码(前提是,我们使用的是默认的HashMap实现)来快速导航到您要查找的键。这是一个恒定时间 (O(1)
) 的操作。
.exists
不能那样做,因为它正在寻找一个任意条件,而不是一个确切的对象。因此,它必须扫描整个集合并评估每个元素的条件,直到找到匹配的元素。这是一个线性时间(O(N)
)操作。
至于为什么 Map.contains
returns 在您的情况下为 false,那一定是因为您的 hashCode
实现不正确:您使用的是默认值 .##
,它不同的实例会有所不同,即使它们包含相同的值(除非是 class)。
我在 Scala 中有一张地图 var surfaceMap = Map[Surface, Array[Event]]()
,其中 Surface
class 表示由平面组成的几何表面。在 Surface class 中,我定义 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.##
等式检查构成曲面的所有平面是否具有相同的坐标。我有一个包含 8 个元素的 surfaceMap,当我想将 Event
添加到地图中已有的表面时,当我使用 surfaceMap.contains(newSurface)
检查密钥是否存在时,它 returns false但是当我使用 surfaceMap.exists(_._1 == newSurface)
或 surfaceMap.keySet.exists(_ == newSurface)
时,它需要更长的时间并且 returns 是正确的。我以为 .contains()
和 .keySet.exists()
做同样的工作,但看起来它们是不同的,但我不明白其中的区别。任何帮助表示赞赏。
Map.keySet.exists
与 Map.contains
、Map.keySet.contains
做的事情不同。
区别在于.contains
使用对象的哈希码(前提是,我们使用的是默认的HashMap实现)来快速导航到您要查找的键。这是一个恒定时间 (O(1)
) 的操作。
.exists
不能那样做,因为它正在寻找一个任意条件,而不是一个确切的对象。因此,它必须扫描整个集合并评估每个元素的条件,直到找到匹配的元素。这是一个线性时间(O(N)
)操作。
至于为什么 Map.contains
returns 在您的情况下为 false,那一定是因为您的 hashCode
实现不正确:您使用的是默认值 .##
,它不同的实例会有所不同,即使它们包含相同的值(除非是 class)。