Как убрать все ключи, указывающие на заданное значение - PullRequest
0 голосов
/ 15 мая 2018

Давайте получим следующую (изменяемую) карту:

1   -> A
45  -> A
88  -> R
98  -> X
105 -> A

Теперь я хочу удалить все элементы, указывающие на A.Я придумал следующий код:

// Version 1
myMap.forEach { key, value -> if (value == "A") myMap.remove(key) }

// Version 2
with (myMap) {
    val filtered = filterValues { it != "A" }
    clear()
    putAll(filtered)
}

Но почему-то ничего из этого не кажется правильным.Так какой же правильный, самый элегантный способ?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Почему вам не нравится версия 1? Это то, что я бы использовал. Другой вариант:

with(myMap.iterator()) {
    forEach { if (it.value == "A") remove() }
}

Хотя это также зависит от того, сколько элементов вы собираетесь удалить: только несколько (тогда remove, вероятно, будет быстрее), или большинство (filterValues может быть быстрее)?

0 голосов
/ 15 мая 2018

Один из способов сделать это - объявить вашу карту как Map вместо MutableMap и просто перезаписать ее отфильтрованной версией:

var myMap = mapOf(1 to "A", 2 to "B")
myMap = myMap.filterValues { it != "A" }
println(myMap) 

Если вы хотите MutableMap (пока еще var) версия, она похожа:

var myMap = mutableMapOf(1 to "A", 2 to "B")
myMap = myMap.filterValues { it != "A" } as MutableMap
println(myMap)

Обновление : Марио Топольник правильно указывает, что приведение здесь более эффективно, чем вызов .toMutableMap() как новогокопия не создана.

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