Дублируйте вложенную карту в MutableMap в Kotlin - PullRequest
0 голосов
/ 29 марта 2020

При наличии вложенной неизменяемой карты:

val someNestedMap = mapOf(
    2 to mapOf(
        "a" to true,
        "b" to false,
        "c" to true
    ),
    3 to mapOf(
        "d" to false,
        "e" to true,
        "f" to false
    )
)

Если я хочу новую копию этой точной структуры, но с каждой из карт, которая будет изменчивой, есть ли простой способ сделать это в Kotlin?

Я хочу создать копию вышеупомянутого как val newCopy: MutableMap<Int, MutableMap<Int, Boolean>>

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Вы можете сделать это одной строкой, сопоставив ключи и затем преобразовав всю карту:

return immutableMap.mapValues { it.value.toMutableMap() }.toMutableMap()

Вы можете сделать из нее обобщенную функцию расширения c следующим образом:

fun <K, VK, VV> Map<K, Map<VK, VV>>.toDeeplyMutableMap() = 
    mapValues { it.value.toMutableMap() }.toMutableMap()

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

0 голосов
/ 29 марта 2020

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

fun copyIt(immutableMap: Map<Int, Map<Int, Boolean>>): MutableMap<Int, MutableMap<Int, Boolean>>
{
    val newCopy: MutableMap<Int, MutableMap<Int, Boolean>> = mutableMapOf()

    for (mapValue in immutableMap.entries) {
        newCopy[mapValue.key] = mapValue.value.toMutableMap()
    }

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