【问题标题】:Best replacement of .deep method in Scala 2.13Scala 2.13 中 .deep 方法的最佳替换
【发布时间】:2020-12-20 12:18:05
【问题描述】:

因为 .deep 方法自 Scala 2.13 起已被删除 比较两个与 .deep 工作相同的数组的最佳方法是什么? 示例:(在 Scala 2.13 之前,它的工作方式如下)

 scala> Array(Array(1),2).deep == Array(Array(1),2).deep
 res3: Boolean = true

一种首选的解决方案是使用 sameElements 方法,但如果 Array 是嵌套的,则此方法不起作用。示例:

scala> Array(Array(1),2) sameElements Array(Array(1),2)
res0: Boolean = false

注意:我使用的是 Scala 2.13.3

【问题讨论】:

  • 不要使用Array?
  • 除非你有充分的理由 - 1) 使用 ListVector 或任何其他不可变集合,2) 不要创建将某些东西解析为 Any 的东西(ADT?)。那你就免费平等了。
  • 我需要一个仅使用数组的解决方案。
  • 您需要使用while 循环和isInstanceOf 检查来实现自己的比较功能。 - 使用 Arrays 的唯一原因是原始性能,deep 非常慢,因此没有意义。为什么需要数组?此外,由于它们是嵌套的,它们都是Array[Any],这是非常无用且不习惯的。 - 如果你反对语言,语言就会反对你。修复你的设计会更好,这样这个问题就会自行解决。

标签: arrays scala scala-collections


【解决方案1】:

如果您只对相等性感兴趣并且您正在处理本机数组,您可以使用java.util.Arrays.deepEquals,它记录在here

引用文档:

返回true,如果两个指定的数组深度相等为一 其他。与equals(Object[],Object[]) 方法不同,此方法是 适用于任意深度的嵌套数组。

如果两个数组引用都是null,则认为两个数组引用是完全相等的,或者 如果它们引用包含相同数量元素的数组并且 两个数组中所有对应的元素对都深 相等。

两个可能为 null 的元素 e1e2 是完全相等的,如果其中任何一个 以下条件成立:

  • e1e2 都是对象引用类型的数组,Arrays.deepEquals(e1, e2) 会返回 true
  • e1e2 是相同基本类型的数组,Arrays.equals(e1, e2) 的适当重载将返回 true
  • e1 == e2
  • e1.equals(e2) 将返回 true

请注意,此定义允许 null 元素处于任何深度。

如果指定的数组中的任何一个包含自己作为元素 直接或间接通过一层或多层阵列, 此方法的行为未定义。

【讨论】:

    【解决方案2】:

    @stefanobaghino 解决方案很好。

    但是,如果您没有 Array[Object] 而是其他类型,例如Array[Byte],最好是Objects.deepEquals(),它允许使用任何 Array 类型。

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 2021-07-17
      • 1970-01-01
      • 2011-02-19
      • 2011-10-16
      • 2019-12-19
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多