Сравните scala сопоставления значений со списком и верните значение по умолчанию для ключей, которых нет в списке - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь сравнить ключи Scala HashMap со списком значений, если ключ не существует в списке, мне нужно обновить значение карты до значения по умолчанию -1.

Например: рассмотрим следующий случай:

Список:

val pos = List("100","110")

Карта:

scala> idSizeMap
res2: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363, 120 -> 1825405636, 130 -> 2194234, 72 -> 3685020648)

Используя filterKeys, я могу сделать пересечение как операция

scala> val result = idSizeMap.filterKeys(pos.contains)
result: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363)

Но вместо этого я также хочу ключи на старой карте со значением по умолчанию -1. Ожидаемый результат:

Map(100 -> 4240070722, 110 -> 611884363, 120 -> -1, 130, -1, 72 -> -1)

Также я попробовал следующее, которое выполняет ту же операцию, что и filterKeys:

var similarItems = Map[String, Long]()
similarItems: scala.collection.immutable.Map[String,Long] = Map()

scala> for (eachpos <- pos) {
     |   if (!eidSizeMap.contains(eachpos)) similarItems += (eachpos -> -1)
     |   else
     |   similarItems += (eachpos -> eidSizeMap(eachpos))
     | }

scala> similarItems
res8: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363)

Какой наиболее подходящий Scala способ достижения этого?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

Рассмотрим transform

idSizeMap.transform((k, v) => if (pos.contains(k)) v else -1)

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

4 голосов
/ 05 февраля 2020

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

idSizeMap.map{ case (k, v) => k -> (if (pos.contains(k)) v else -1) }
...