我想检查两个Traversable是否包含相同的元素,而不考虑它们的顺序。

因此,我自己尝试了一下并编写了以下简单示例:

implicit val l = 3
implicit def equality(implicit l: Int) = new Equality[String] {
  override def areEqual(a: String, b: Any): Boolean = (a, b) match {
    case (_, b: Int) => a.toInt == b
  }
}

"Test" should "check how equality works" in {
    List("1") should contain theSameElementsAs Vector(1) //Fine
    List("1", "2") should contain theSameElementsAs Vector(1, 2) //Fine
    List("1", "2", "3") should contain theSameElementsAs Vector(1, 2, 3) //Fine
    List("1", "2", "2") should contain theSameElementsAs Vector(1, 2, 2) //Error
    List("2", "1") should contain theSameElementsAs Vector(1, 2) //Error
}

正如the documentation所说:

contain theSameElementsAs”语法使您可以断言两个
聚合包含相同的对象

它不应该考虑重复和顺序。怎么了

最佳答案

我认为根本的问题是equality关系不像人们期望的那样具有反射性。那就是x == y,然后y == x

Scalacheck使用提供的equality函数尝试在目标集合中使用count the number of repetitions

当遇到equality(2,2)tryEquality fails internally with a ClassCastException 时,默认比较为false。

底线:Equality需要具有反射性(如良好的旧数学所规定),以便获得预期的结果。

关于scala - 如何比较两个Traversable包含完全相同的元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40692757/

10-11 08:17