Сравнение двух списков в котлине - PullRequest
0 голосов
/ 28 августа 2018

Я сталкивался с функцией kotlin равно , чтобы сравнить два списка одного типа. Он отлично работает для чистого Kotlin с классами данных.

Я использую библиотеку Java в проекте Kotlin, в котором метод обратного вызова возвращает список объектов за интервал времени X секунд. Попытка сравнить старый список с новым списком для каждого вызова, но при равенстве возвращает значение false, даже если элементы совпадают и равны.

val mOldList: MutableList<MyObject>()? = null

override fun updatedList(list: MutableList<MyObject>){
    // other code
    if (mOldList.equals(list)) // false everytime
}

Это из-за метода равных в Java из библиотеки?

Альтернативные предложения для сравнения списка были бы признательны.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

В списках Java реализован метод equals, и два списка определены равными, если они содержат одинаковые элементы в одном и том же порядке. Я полагаю, вам не хватает equals метода в вашем MyObject классе.

0 голосов
/ 18 июня 2019

Использование 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       
    }
}
0 голосов
/ 28 августа 2018

Вы можете перебирать один список и проверять соответствующее значение позиции из второго списка. Возьмите пример ниже для справки.

var list1 = mutableListOf<String>()
var list2 = mutableListOf<String>()

list1.forEachIndexed { i, value ->
    if (list2[i] == value)
    {
        // your implementaion
    }  
}

Дополнительно вы можете отфильтровать список для измененных значений.

var list1 = mutableListOf<String>()
var list2 = mutableListOf<String>()

val changedList = list1.filterIndexed { i, value -> 
    list2[i] != value)
}
...