如何比较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
包裹数组和y
的that
, 否则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中的两个数组?的主要内容,如果未能解决你的问题,请参考以下文章