Asw*_*win 8 java kotlin kotlin-interop
我遇到了kotlin equals函数来比较两个相同类型的列表。它对于带有数据类的纯Kotlin很好用。
我正在Kotlin项目中使用Java库,其中的回调方法以X秒的时间间隔返回对象列表。尝试针对每个调用将旧列表与新列表进行比较,但是即使项目相同且相等,equals也会返回false。
val mOldList: MutableList<MyObject>()? = null
override fun updatedList(list: MutableList<MyObject>){
// other code
if (mOldList.equals(list)) // false everytime
}
Run Code Online (Sandbox Code Playgroud)
这是因为Java的来自库的equals方法吗?
列表比较的替代建议将是有益的。
Dru*_*uma 22
如果您不关心两个列表中元素的顺序,并且您的目标只是检查两个列表是否包含完全相同的元素,而没有其他任何元素,您可以考虑两个相互containsAll调用,例如:
var list1 = mutableListOf<String>()
var list2 = mutableListOf<String>()
if(list1.containsAll(list2) && list2.containsAll(list1)) {
//both lists are of the same elements
}
Run Code Online (Sandbox Code Playgroud)
amy*_*nbe 13
使用zip
zip返回由该数组的元素和具有相同索引的另一个数组的元素构建的对列表。返回的列表具有最短集合的长度。
fun listsEqual(list1: List<Any>, list2: List<Any>): Boolean {
if (list1.size != list2.size)
return false
val pairList = list1.zip(list2)
return pairList.all { (elt1, elt2) ->
elt1 == elt2
}
}
Run Code Online (Sandbox Code Playgroud)
Ren*_*ari 11
仅供参考list1 == list2,如果您的自定义对象基于 a data class(它会自动为您覆盖 equals),则无需任何额外工作即可调用。
您可以使用下面的实现来比较两个Collection:
infix fun <T> Collection<T>.deepEqualTo(other: Collection<T>): Boolean {
// check collections aren't same
if (this !== other) {
// fast check of sizes
if (this.size != other.size) return false
val areNotEqual = this.asSequence()
.zip(other.asSequence())
// check this and other contains same elements at position
.map { (fromThis, fromOther) -> fromThis == fromOther }
// searching for first negative answer
.contains(false)
if (areNotEqual) return false
}
// collections are same or they are contains same elements with same order
return true
}
Run Code Online (Sandbox Code Playgroud)
或订购忽略变体:
infix fun <T> Collection<T>.deepEqualToIgnoreOrder(other: Collection<T>): Boolean {
// check collections aren't same
if (this !== other) {
// fast check of sizes
if (this.size != other.size) return false
val areNotEqual = this.asSequence()
// check other contains next element from this
.map { it in other }
// searching for first negative answer
.contains(false)
if (areNotEqual) return false
}
// collections are same or they are contains same elements
return true
}
Run Code Online (Sandbox Code Playgroud)
注意:两个函数只比较深度的第一级
:使用扩展功能的简短版本:
fun List<*>.deepEquals(other : List<*>) =
this.size == other.size && this.mapIndexed { index, element -> element == other[index] }.all { it }
Run Code Online (Sandbox Code Playgroud)
你可以这样使用它:
listOf("Hola", "Mundo").deepEquals(listOf("Hello", "World"))
Run Code Online (Sandbox Code Playgroud)
您可以迭代一个列表并检查第二个列表中相应的位置值。以下面的例子供参考。
var list1 = mutableListOf<String>()
var list2 = mutableListOf<String>()
list1.forEachIndexed { i, value ->
if (list2[i] == value)
{
// your implementaion
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您可以过滤列表以查找更改的值。
var list1 = mutableListOf<String>()
var list2 = mutableListOf<String>()
val changedList = list1.filterIndexed { i, value ->
list2[i] != value)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11243 次 |
| 最近记录: |