给出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())
,但我更喜欢实例方法,因为它可以更好地使用选项。
答案 0 :(得分:30)
在Kotlin 1.1中,您可以使用contentEquals
和contentDeepEquals
来比较结构相等的两个数组。 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引入了按内容比较数组的扩展: contentEquals和contentDeepEquals。
这些扩展程序是 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