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

Phi*_*l H 67 arrays scala pattern-matching

val a: Array[Int] = Array(1,2,4,5)
val b: Array[Int] = Array(1,2,4,5)
a==b // false
Run Code Online (Sandbox Code Playgroud)

是否有模式匹配方式来查看两个数组(或序列)是否相同?

Mor*_*itz 101

您需要将最后一行更改为

a.deep == b.deep
Run Code Online (Sandbox Code Playgroud)

对数组进行深入比较.

  • 这是规范的方法.但只是对性能饥渴的警告:这个_does_在双方都创建了一个全新的集合,所以它不是最有效的方法. (19认同)
  • @Rex是的,它确实创建了一个新的集合,但这并不意味着它是低效的.看看`deep`方法的实现.它创建了一个集合,它将`apply`方法的所有调用转发到原始数组. (7认同)
  • @matanster `deepEquals` 在最新版本中已被弃用。 (3认同)

sc_*_*ray 92

来自Scala编程:

Array(1,2,4,5).sameElements(Array(1,2,4,5))
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是正确的解决方案,即使另一个是被接受的. (3认同)

The*_*aul 18

  a.corresponds(b){_ == _}
Run Code Online (Sandbox Code Playgroud)

Scaladoc:true如果两个序列具有相同的长度和p(x, y)true 对于所有对应的元件xthis包裹阵列和ythat,否则false

  • 数组不是序列http://www.scala-lang.org/api/current/index.html#scala.Array,因此这需要一些(可能是隐式的)重定向. (4认同)

小智 6

为了获得最佳性能,您应该使用:

java.util.Arrays.equals(a, b)
Run Code Online (Sandbox Code Playgroud)

这非常快,不需要额外的对象分配。Array[T]scala中的内容与Object[]java中的相同。对于原始值(例如Intjava)也是如此int


Pow*_*ers 5

从 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]
Run Code Online (Sandbox Code Playgroud)

sameElements在 Scala 2.13 中仍然有效:

a sameElements b // true
Run Code Online (Sandbox Code Playgroud)