2011-03-22 60 views
51
val a: Array[Int] = Array(1,2,4,5) 
val b: Array[Int] = Array(1,2,4,5) 
a==b // false 

是否有一个模式匹配的方法,如果两个阵列(或序列)是等效的?如何比较scala中的两个数组?

+1

重复的http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1-2-not-return-the-expected-result和http://stackoverflow.com从那些/问题/ 3737711 /为什么 - 犯规 - 在阵列平等功能,工作为预期的答案是使用'sameElements' – 2011-03-22 15:14:42

+1

这_is_一个重复的,但'sameElements'没有做对嵌套数组的伎俩,因为它不是递归的。莫里茨的答案现在是适当的(可能应该添加到旧的答案中)。 – 2011-03-22 15:24:26

回答

77

您需要在最后一行改为

a.deep == b.deep 

做阵列的深层次比较。

+15

这是执行它的规范方法。但仅仅是对性能要求很高的警告:这个_does_在两侧都创建了一个全新的集合,所以它不是最有效的方法。 – 2011-03-22 15:26:05

+7

@Rex是的,它创建了一个新的集合,但这并不意味着它效率低下。看看'deep'方法的实现。它创建一个集合,将'apply'方法的所有调用转发给原始数组。 – 2011-03-23 14:54:43

+1

@E。 Verda - 嗯,实现不是我所期望的。但是它为数组的每个元素做了模式匹配,如果它是一个基元数组,那么它是昂贵的;对于嵌套数组,它会在每次访问时重新包装array_。如果阵列几乎完全不同,它便宜;为了匹配相近的阵列,与递归的非建设性解决方案相比,这将是昂贵的。 – 2011-03-23 15:38:57

18
a.corresponds(b){_ == _} 

Scaladoc:true如果两个序列具有 相同的长度和p(x, y)true 对于所有对应的元件 this包裹阵列的xthaty, 否则false

+4

数组不是一个序列http://www.scala-lang.org/api/current/index.html#scala.Array,所以这将需要一些(可能隐式)重定向。 – Basilevs 2011-09-06 17:58:41

73

Programming Scala

Array(1,2,4,5).sameElements(Array(1,2,4,5)) 
+3

我认为这是正确的解决方案,即使另一个是被接受的。 – 2016-03-03 00:45:08

+0

这是帮助我的FreeSpec测试通过的那个。 :-) – 2017-02-14 21:40:24

0

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

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

这是非常快的,并且不需要额外的对象分配。在scala中的Array[T]与在java中的Object[]相同。对于像Int这样的原始值,这是java int