如何在 scala 中比较两个数组?

val a: Array[Int] = Array(1,2,4,5)
val b: Array[Int] = Array(1,2,4,5)
a==b // false

有没有一种模式匹配的方法来判断两个数组(或序列)是否相等?

48227 次浏览

您需要将最后一行更改为

a.deep == b.deep

对数组进行深入的比较。

  a.corresponds(b){_ == _}

如果两个序列都有 同样的长度和 p(x, y)true 的所有相应元素 this包裹阵列和 thaty, 否则 false

来自 编程 Scala:

Array(1,2,4,5).sameElements(Array(1,2,4,5))

为了获得最佳表现,你应该使用:

java.util.Arrays.equals(a, b)

这非常快,并且不需要额外的对象分配。Scala 中的 Array[T]与 java 中的 Object[]相同。对于像 Int这样的原始值也是如此,它就是 java int

从 Scala 2.13开始,deep等价方法就不起作用了,并且出现了错误:

val a: Array[Int] = Array(1,2,4,5)
val b: Array[Int] = Array(1,2,4,5)
a.deep == b.deep // error: value deep is not a member of Array[Int]

sameElements仍然可以在 Scala 2.13中使用:

a sameElements b // true

它看起来不像大多数提供的示例使用多维数组

 val expected = Array(Array(3,-1,0,1),Array(2,2,1,-1),Array(1,-1,2,-1),Array(0,-1,3,4))
val other = Array(Array(3,-1,0,1),Array(2,2,1,-1),Array(1,-1,2,-1),Array(0,-1,3,4))


assert(other.sameElements(expected))

返回 false,抛出断言失败

deep doesn't seem to be a function defined on Array.

为了方便起见,我导入了最大级别的匹配器,它工作正常。

import org.scalatest.matchers.should.Matchers._
other should equal(expected)