Scala 2.13 中最佳的 .deep 方法替代方案

3

由于 Scala 2.13 中已删除了 .deep 方法,那么比较两个数组的最佳方式是什么,使其与 .deep 产生相同的效果? 例如:(在 Scala 2.13 之前,它将按以下方式工作)

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

一种首选解决方案是使用sameElements方法,但如果数组嵌套,则该方法无法工作。例如:
scala> Array(Array(1),2) sameElements Array(Array(1),2)
res0: Boolean = false

注意:我正在使用Scala 2.13.3。

1
不要使用Array - cchantep
1
除非你有充分的理由,否则请遵循以下编程规则:1)使用ListVector或任何其他不可变集合;2)不要创建将某些东西解析为Any(ADT?)的对象。这样,你就可以自动获得相等性。 - Mateusz Kubuszok
我需要一个仅使用数组的解决方案。 - Anjali Sharma
2
您需要使用while循环和isInstanceOf检查来实现自己的比较函数。- 使用Arrays的唯一原因是原始性能,“deep”非常慢,因此没有意义。为什么需要Arrays?而且,由于它们是嵌套的,它们都是Array[Any],这相当无用和不成体系。- 如果您违反语言规则,语言将反过来影响您。最好修复设计,这样问题就会自行解决。 - Luis Miguel Mejía Suárez
2个回答

2
如果您只对相等性感兴趣并且正在处理本地数组,则可以使用java.util.Arrays.deepEquals,该方法的文档在这里中记录。
引用文档:
如果两个指定的数组彼此深度相等,则返回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元素。
如果任一指定的数组直接或间接地通过一个或多个级别的数组包含自身作为元素,则该方法的行为未定义。

1

@stefanobaghino的解决方案很好。

但是如果您没有Array[Object]而是其他类型,比如Array[Byte],那么使用Objects.deepEquals()可能更好,它允许使用任何数组类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接