【问题标题】:How do I compare two arrays in scala?如何比较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

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

【问题讨论】:

标签: arrays scala pattern-matching


【解决方案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

    【讨论】:

    【解决方案6】:

    您需要将最后一行更改为

    a.deep == b.deep
    

    对数组进行深度比较。

    【讨论】:

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