如何在Scala中比较两个数组?


72
val a: Array[Int] = Array(1,2,4,5)
val b: Array[Int] = Array(1,2,4,5)
a==b // false

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



1
重复的,但sameElements对于嵌套数组并没有用处,因为它不是递归的。莫里兹(Moritz)在下面的答案现在是合适的答案(应该将其添加到较早的答案中)。
Rex Kerr

Answers:


108

您需要将最后一行更改为

a.deep == b.deep

对数组进行深入比较。


20
这是规范的方法。但这只是对性能要求极高的警告:这确实会在两侧创建一个全新的集合,因此,这并不是最有效的方法。
Rex Kerr

8
@Rex是的,它确实创建了一个新集合,但这并不意味着它效率低下。看一下该方法的实现deep。它创建一个集合,该集合将apply方法的所有调用转发到原始数组。
E. Verda

1
@E。Verda-嗯,实施不是我所期望的。但是它对数组的每个元素都进行模式匹配,如果是原语数组,则模式匹配会很昂贵;对于嵌套数组,它会在每次访问时重新包装数组。如果阵列几乎完全不同,那就便宜了。要匹配封闭数组,与递归非构造解决方案相比,它会很昂贵。
Rex Kerr

@LucaMolteni:你的意思是Array.equals?似乎没有提供深入的比较。
mitchus

1
@matansterdeepEquals在最新版本中已弃用。
约翰尼



9

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

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

这非常快,不需要额外的对象分配。Array[T]scala中的内容与Object[]java中的相同。对于原始值(例如Intjava)也是如此int


1
val t0 = System.nanoTime(); val r = (java.util.Arrays.equals(a,b)) ; val t1 = System.nanoTime(); t1 - t0在此示例代码和其他示例的非常相似的代码上运行...此选项比其他示例更快。
codeaperature

4

从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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.