如何比较Kotlin中的两个数组?

时间:2016-02-08 15:05:02

标签: arrays equals kotlin

给出Kotlin中的一些数组

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

Kotlin std-lib是否有内置函数可以为每个元素测试两个数组的(值)相等?

因此导致:

a.equals(b) // true
a.equals(c) // false
在这两种情况下,

equals()实际上都返回了false,但也许Kotlin可以使用内置函数吗?

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

5 个答案:

答案 0 :(得分:30)

在Kotlin 1.1中,您可以使用contentEqualscontentDeepEquals来比较结构相等的两个数组。 e.g:

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

在Kotlin 1.0中,Kotlin std-lib没有内置函数可以测试两个数组的每个元素的(值)相等。"

"总是使用equals()比较数组,因为所有其他对象" (Feedback Request: Limitations on Data Classes | Kotlin Blog)。

如果a.equals(b)true引用相同的数组,则a只返回b

但是,您可以使用extension functions创建自己的"选项"友好方法。 e.g:

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 :(得分:21)

Kotlin 1.1引入了按内容比较数组的扩展: contentEqualscontentDeepEquals

这些扩展程序是 infix ,因此您可以通过以下方式使用它们:

val areEqual = arr1 contentEquals arr2

答案 2 :(得分:13)

如果你想比较两个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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

在koltin中,如果您的数组或ArrayList是 data Class类型,则可以简单地比较 array:a array:b

像这样

if(a == b)

如果匹配两个数组的所有值,它将返回简单的布尔值,但是如果您匹配的数据不是 data Class,则可以使用此扩展名将其与单一值

fun <T> Array<T>.isEqual(comparable: Array<T>): Boolean {
    var isChanged = true

    if (this.size == comparable.size) {
        for (index in 0 until comparable.size) {
            if (this[index] != comparable[index]) {
                isChanged = false
                break
            }
        }
    } else {
        isChanged = false
    }

    return isChanged
}

然后您可以使用数组

    val a = arrayOf("first", "second")
    val b = arrayOf("first", "second")

    println(a.isEqual(b)) //true

    a[0] = "third"

    println(a.isEqual(b)) //false