Как преобразовать список в карту с Kotlin - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь построить карту из списка.Моя цель - сравнить два списка и найти различия между этими двумя списками.Затем я хочу построить карту, чтобы узнать, по какому индексу я нашел различия.

Я сделал это на Java, я думаю, не очень хорошо, но он работает.

//I compare the two values for a given index, if value are the same, I set null in my result list
List<String> result = IntStream.range(0, list1.size()).boxed()
                .map(i -> list1.get(i) != list2.get(i) ? (list1.get(i)  + " != "+ list2.get(i)) : null)
                .collect(Collectors.toList());

//I filter all the null values, in order to retrieve only the differences with their index
Map<Integer, String> mapResult =
            IntStream.range(0, result.size())
            .boxed().filter(i-> null != result.get(i))
            .collect(Collectors.toMap(i -> i,result::get));

Это не оптимально, но работает.Если у вас есть предложения относительно этих строк кода, я с радостью приму их.

Я попробовал два варианта такого поведения в Kotlin, но мне не удалось использовать конструктор map ().(Я все еще изучаю Kotlin, я не очень знаком с ним).

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете использовать функцию zip в коллекциях, чтобы объединить два элемента.Функция withIndex() помогает превратить список в список пар индекса и значения элемента.Полное решение может быть следующим:


    val list1 = listOf("a", "b", "c")
    val list2 = listOf("a", "B", "c")

    val diff : Map<Int, String> = list1.withIndex()
        .zip(list2) { (idx,a), b -> if (a != b) idx to "$a != $b" else null}
        .filterNotNull().toMap()

Обратите внимание, что функция zip выполняет итерацию, пока в обоих списках есть элементы, она пропустит возможный остаток из любого из списков.Это можно исправить, добавив пустые элементы с помощью следующей функции:


fun <T> List<T>.addNulls(element: T, toSize: Int) : List<T> {
    val elementsToAdd = (toSize - size)
    return if (elementsToAdd > 0) {
        this + List(elementsToAdd) { element }
    } else {
        this
    }
}

и вызовите функцию из обоих списков перед использованием функции zip

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...