Kotlin: Создание изменяемой карты из списка пар, а не varargs? - PullRequest
1 голос
/ 31 марта 2020

У меня есть список в Kotlin. Мне нужно создать карту из каждого элемента списка, в пустой изменяемый набор, что-то вроде этого -

var mutableMap: MutableMap<Int, MutableSet<Int>> = mutableMapOf(someList.map{ it to mutableSetOf<Int>() })

Но я получаю эту ошибку -

Type mismatch.
Required:
Pair<TypeVariable(K), TypeVariable(V)>
Found:
List<Pair<Int, MutableSet<Int>>>

I знаю, что mutableMapOf () принимает varargs pairs, поэтому я попробовал оператор распространения (*), но это также не сработало. Пожалуйста, помогите мне достичь результата.

Ответы [ 3 ]

3 голосов
/ 31 марта 2020
val mutableMap: Map<Int, MutableSet<Int>> = someIntList.associateWith { mutableSetOf<Int>() }
1 голос
/ 31 марта 2020

Оператор распространения предназначен для массивов, а не списков. Кроме того, если вы определяете тип вашей переменной как Map of Sets вместо MutableMap из MutableSets, вы приводите его к неизменяемости. Чтобы исправить ваш код:

var mutableMap: MutableMap<Int, MutableSet<Int>> = mutableMapOf(*someList.map{ it to mutableSetOf<Int>() }.toTypedArray())

Но было бы чище сделать:

val map = someList.associateWith { mutableSetOf<Int>() }.toMutableMap()
0 голосов
/ 31 марта 2020

Вам не нужно использовать mutableMapOf() с аргументами; В списке есть удобная функция расширения, которая может сделать это за вас: toMap().

К сожалению, toMutableMap() не существует. Одним из способов может быть преобразование в карту только для чтения, а затем преобразование , что в изменяемую карту:

val mutableMap = someList.toMap().toMutableMap()

Несколько более сложным, но более эффективным способом было бы предоставить получившаяся карта:

val mutableMap = someList.toMap(mutableMapOf())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...