Set,contains包含返回匹配而不是布尔值

时间:2015-11-04 09:26:43

标签: scala collections

我努力创建一个类,我有一个equals方法,它定义了一个等价关系,其中分区集的大小== 1。

该类采用绝对路径和根(也是路径),如果它们相对于其根的路径相同,则这些“相对路径”是等效的。我有两套这些,我确保每个集合中的所有元素都具有相同的根。所以,根据我的逻辑,应该有一个或零个元素(第二个集合中的s()= =第一个集合中的任何元素。

但现在我意识到我没有我想要的好的O(1)查找,因为Set.contains()方法只返回一个布尔值,而不是它找到的元素!有没有我不知道的方法或集合会给我我正在寻找的O(1)行为(即对等号的O(1)查找,返回相等的元素。)

2 个答案:

答案 0 :(得分:2)

重新定义平等意味着除了所有元素的平等之外的其他东西几乎总是一个坏主意。 Scala集合假设如果两个东西相等,它们是可互换的。你的方法并非如此。

我认为你必须使用Map [T,T]而不是Set [T]来做你想做的事。

答案 1 :(得分:2)

之前肯定会有人问过,但如果是这样,我就找不到了。

据我所知,API中有一个漏洞。

也许希望有人能做得更好,但我能找到的最好的解决方法是:

def lookup[T](s: Set[T], x: T): Option[T] =
  s.intersect(Set(x)).headOption

让我们一起旋转吧。首先定义一个案例类,其中包含不会影响平等的额外信息:

scala> case class C(x: Int)(val y: Int)
defined class C

scala> C(3)(5) == C(3)(6)
res4: Boolean = true

现在让我们试一下测试用例:

scala> val s = Set(C(3)(5), C(8)(2), C(7)(6))
s: scala.collection.immutable.Set[C] = Set(C(3), C(8), C(7))

scala> lookup(s, C(8)(99)).map(_.y)
res6: Option[Int] = Some(2)

看起来不错。

至于它是否是O(1),在我看来它是在仔细阅读https://github.com/scala/scala/blob/2.11.x/src/library/scala/collection/immutable/HashSet.scala