如何比较 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
如果 a
和 b
引用同一个数组。
但是,您可以使用 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
给定 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
如果 a
和 b
引用同一个数组。
但是,您可以使用 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