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

Posted

技术标签:

【中文标题】如何比较scala中的两个数组?【英文标题】:How do I compare two arrays in scala? 【发布时间】:2011-07-20 13:52:27 【问题描述】:
val a: Array[Int] = Array(1,2,4,5)
val b: Array[Int] = Array(1,2,4,5)
a==b // false

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

【问题讨论】:

***.com/questions/2481149/… 和 ***.com/questions/3737711/… 的重复答案是使用 sameElements is 重复,但 sameElements 对嵌套数组不起作用,因为它不是递归的。莫里茨下面的答案现在是合适的(可能应该添加到旧答案中)。 【参考方案1】:

看起来大多数提供的示例都不适用于多维数组。例如

 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.

为方便起见,我导入了 scalatest 匹配器并且它起作用了。

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

【讨论】:

【参考方案2】:

从 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

【讨论】:

这应该只是对答案的评论。【参考方案3】:

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

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

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

【讨论】:

我在这个示例代码上运行了val t0 = System.nanoTime(); val r = (java.util.Arrays.equals(a,b)) ; val t1 = System.nanoTime(); t1 - t0,在其他示例中运行了非常相似的代码......这个选项比其他示例快得多。【参考方案4】:

来自Programming Scala:

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

【讨论】:

我认为这是正确的解决方案,即使另一个已被接受。 这是帮助我通过 FreeSpec 测试的一个。 :-)【参考方案5】:
  a.corresponds(b)_ == _

Scaladoc: true 如果两个序列都有 相同的长度和p(x, y)true 对于所有对应的元素x this 包裹数组和 ythat, 否则false

【讨论】:

数组不是序列scala-lang.org/api/current/index.html#scala.Array,所以这需要一些(可能是隐式的)重定向。【参考方案6】:

您需要将最后一行更改为

a.deep == b.deep

对数组进行深度比较。

【讨论】:

这是规范的做法。但这只是对渴望性能的人的警告:这确实在双方都创建了一个全新的集合,因此它不是最有效的方法。 @Rex 是的,它确实创建了一个新集合,但这并不意味着它效率低下。看方法deep的实现。它创建一个集合,将所有对 apply 方法的调用转发到原始数组。 @E. Verda - 嗯,实现不是我所期望的。但是它对数组的每个元素进行模式匹配,如果它是一个基元数组,这会很昂贵,而对于嵌套数组,它在每次访问时重新包装数组 .如果阵列几乎完全不同,那么它很便宜;对于匹配紧密数组,与递归非构造解决方案相比,它会很昂贵。 @LucaMolteni:你是说Array.equals吗?这似乎无法提供深入的比较。 @matanster deepEquals 在最新版本中已弃用。

以上是关于如何比较scala中的两个数组?的主要内容,如果未能解决你的问题,请参考以下文章

比较 Scala 和 Spark 中的两个文件内容

Spark 中的数据框比较:Scala

将一个数据帧的数组列与scala中另一个数据帧的数组列的子集进行比较

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

如何比较标准 SQL(BigQuery)中的两个数组?

Vuejs2 - 如何将两个数组中的元素与计算属性进行比较?