Удаление элементов из списка, которых нет в другом списке - Kotlin

У меня есть два mutableList, в 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
     */
}
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
4
0
4 202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите работать непосредственно с этим 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

Большое спасибо. Вы спасли мой день.

Nux 22.05.2019 15:17

@Roland, что, если мне нужно проверить 2 ключа в объекте, то есть я хочу удалить все объекты из списка A, которые присутствуют в списке B с Key1 и Key2?

shapan dashore 25.09.2021 03:59

Другие вопросы по теме