Как удалить ключ с карты в опции Scala - PullRequest
0 голосов
/ 21 апреля 2020

Скажем, у меня есть такие случаи.

case class someClass0(content: someClass1)

case class someClass1(someContent: Option[Map[String, someClass2]])

case class someClass2(someKey: Array[Int])

Мне нужно удалить элементы на карте (которые являются неизменяемыми) по значениям.

Это значения, которые я получаю с помощью итерации.

  val keys_to_remove = new ListBuffer[String]()
  val keys_to_keep: List[Int] = List(100, 200)
  for (x <- keys_to_keep) {
    content.someContent.get.foreach {
      case (key: String, value: someClass2) => {
        if (!value.someKey.contains(x)) {
          keys_to_remove.append(key)
        }
      }
    }
  }

Итак, как сохранить всю структуру и удалить только необходимые элементы по ключу?

Я пытался изменить тип карты, например

content.someContent.map(_.to(collection.mutable.Map))

Но content.someContent.get.remove(key) не работает. Что я делаю не так?

Ответы [ 4 ]

4 голосов
/ 21 апреля 2020

Для этого вам не нужна изменчивость.

val keys_to_keep: List[String] = List("a", "b")

val res = content.someContent.map(
  _.filterKeys(k => !keys_to_keep.contains(k))
)

filterKeys фильтрует Map, проверяя ключ каждой записи на соответствие условию.


Конечно , важно помнить, что вы не можете проверить contains на List[Int] против Strings, так как результат всегда будет ложным.


Кроме того, попробуйте поискать руководства по стилям для Scala:

  • Классы обычно именуются в верхнем регистре верблюдов
  • Значения и переменные обычно именуются в нижнем регистре верблюдов

Попробуйте

1 голос
/ 22 апреля 2020

Вот как вы можете это сделать:

val optionalMap = someClass0.content.someContent.map {
  contentMap => contentMap - keyToBeRemoved
}

val originalStructure = someClass0.copy(content = SomeClass1(optionalMap))

Вот Scast ie

1 голос
/ 21 апреля 2020

Вы можете сделать это, используя оператор - и foldLeft для удаления ключей.

вы используете get для получения значения, если вы хотите сделать это безопасно, вам нужно использовать:

content.someContent.map(immutableMap => 
  keys_to_remove.foldLeft(immutableMap){
    (map, key) =>
      map - key
}).getOrElse(Map.empty[String, SomeClass2])

это работает как в этом примере:

import scala.collection.mutable.ListBuffer
val immutableMap = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)
val keys_to_remove: ListBuffer[String] = ListBuffer("b", "d")
println(immutableMap) // Map(a -> 1, b -> 2, c -> 3, d -> 4)
val mapWithoutKeys = keys_to_remove.foldLeft(immutableMap){
  (map, key) =>
    map - key
}
println(mapWithoutKeys) //Map(a -> 1, c -> 3)
0 голосов
/ 23 апреля 2020

Это удалит все ключи и сохранит структуру

val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))
...