Удаление элементов из списка, которых нет в другом списке - PullRequest
0 голосов
/ 22 мая 2019

У меня есть два mutableLists, listOfA имеет так много объектов, включая дубликаты, в то время как listOfB имеет меньше. Поэтому я хочу использовать listOfB для фильтрации похожих объектов в listOfA, чтобы весь список имел одинаковое количество объектов с эквивалентными ключами в конце. Код ниже может объяснить больше.

fun main() {
    test()
}

data class ObjA(val key: String, val value: String)
data class ObjB(val key: String, val value: String, val ref: Int)

fun test() {
    val listOfA = mutableListOf(
            ObjA("one", ""),
            ObjA("one", "o"),
            ObjA("one", "on"),
            ObjA("one", "one"),

            ObjA("two", ""),
            ObjA("two", "2"),
            ObjA("two", "two"),

            ObjA("three", "3"),
            ObjA("four", "4"),
            ObjA("five", "five")
    )

    //Use this list's object keys to get object with similar keys in above array.
    val listOfB = mutableListOf(
            ObjB("one", "i", 2),
            ObjB("two", "ii", 5)
    )

    val distinctListOfA = listOfA.distinctBy { it.key } //Remove duplicates in listOfA

    /*    
    val desiredList = doSomething to compare keys in distinctListOfA and listOfB
    for (o in desiredList) {
        println("key: ${o.key}, value: ${o.value}")
    }
    */

    /* I was hoping to get this kind of output with duplicates removed and comparison made.
      key: one, value: one
      key: two, value: two
     */
}

1 Ответ

1 голос
/ 22 мая 2019

Если вы хотите работать непосредственно с этим distinctListOfA, вы можете использовать removeAll, чтобы удалить все соответствующие записи из него.Просто убедитесь, что вы инициализируете ключи B только один раз, чтобы они не оценивались каждый раз, когда применяется предикат:

val keysOfB = listOfB.map { it.key } // or listOfB.map { it.key }.also { keysOfB ->
distinctListOfA.removeAll {
  it.key !in keysOfB
}
//} // if "also" was used you need it

Если у вас есть MutableMap<String, ObjA> на месте после оценки вашегоуникальные значения (и я думаю, что здесь может иметь смысл работать с Map), следующие могут быть такими, какие вы ищете:

val map : MutableMap<String, ObjA> = ...
map.keys.retainAll(listOfB.map { it.key })

retainAll просто сохраняетте значения, которые соответствуют заданным записям коллекции и после ее применения карта теперь содержит только ключи one и two.

На тот случай, если вы хотите сохранить свои предыдущие списки / карты и скорее хотите новыйсписок / карта, вместо этого вы можете просто вызвать что-то вроде следующего перед работой с ним:

val newList = distinctListOfA.toList() // creates a new list with the same entries
val newMap = yourPreviousMap.toMutableMap() // create a new map with the same entries
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...