2016-02-08 15 views
20

鉴于某些阵列在科特林如何比较Kotlin中的两个数组?

let a = arrayOf("first", "second") 
val b = arrayOf("first", "second") 
val c = arrayOf("1st", "2nd") 

是否有内置功能的科特林STD-lib中,测试两个数组的每个元素(值)相等?

所以导致:

a.equals(b) // true 
a.equals(c) // false 

equals()真的返回在这两种情况下false,但也许还有内置的功能来科特林,人们可以使用?

有静态函数java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())但我宁愿更喜欢实例方法,因为它可以更好地与选项。

+0

这可能是扩展功能的一种情况。 –

回答

17

Kotlin 1.1引入了用于按内容比较阵列的扩展: contentEqualscontentDeepEquals

这些扩展,这样你就可以使用它们的方式如下:

val areEqual = arr1 contentEquals arr2 
15

在Kotlin 1.1中,您可以使用contentEqualscontentDeepEquals来比较两个数组结构的等式。例如为:

a contentEquals b // true 
b contentEquals c // false 

在科特林1.0有没有“内置函数到科特林STD-LIB,测试两个阵列为每个元素(值)相等”。

“总是使用equals()来比较阵列,因为所有其他对象”(Feedback Request: Limitations on Data Classes | Kotlin Blog)。

所以a.equals(b)将只返回true如果ab引用相同的数组。

但是,您可以使用extension functions创建自己的“可选项” - 友好的方法。例如:

fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other) 
fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other) 

P.S.对Feedback Request: Limitations on Data Classes | Kotlin Blog的评论也值得一读,特别是comment 39364

1

对于一个简单的等号(不深等号!):

otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty() 

该代码将比较大小和项目。这些项目与.equals()进行比较。

+5

这不考虑阵列的顺序;但是一般的方法对于套件是有好处的。 –

1

如果你想比较两个Collections内容无视为了你可以添加这个简单的扩展:

infix fun <T> Collection<T>.sameContentWith(collection: Collection<T>?) 
    = collection?.let { this.size == it.size && this.containsAll(it) } 

...并使用它像这样:

a = mutableListOf<String>() 
b = mutableListOf<String>() 

isListsHasSameContent = a sameContentWith b