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

How to compare two arrays in 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()),但我更喜欢实例方法,因为它可以更好地使用可选值。

在 Kotlin 1.1 中,您可以使用 contentEquals and contentDeepEquals 来比较两个数组的 结构 相等性。例如:

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

在 Kotlin 1.0 中没有 "built-in functions to the Kotlin std-lib that tests two arrays for (value) equality for each element."

"Arrays are always compared using equals(), as all other objects" (Feedback Request: Limitations on Data Classes | Kotlin Blog).

所以 a.equals(b) 只会 return true 如果 ab 引用同一个数组。

但是,您可以使用 extension functions 创建自己的 "optionals" 友好方法。例如:

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 上的评论也值得一读,特别是 评论 39364.

对于简单的等号(不是深度等号!):

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

此代码将比较尺寸和项目。项目与 .equals().

进行比较

Kotlin 1.1 引入了按内容比较数组的扩展: contentEquals and contentDeepEquals.

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

val areEqual = arr1 contentEquals arr2

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

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

像这样

if(a == b)

如果它匹配两个数组的所有值,它将 return 简单布尔值,但如果你匹配的不是数据 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