如何在选项Scala中从映射中删除密钥
假设我有这样的案例课程如何在选项Scala中从映射中删除密钥,scala,scala-collections,Scala,Scala Collections,假设我有这样的案例课程 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]()
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.get.remove(key)
不起作用。
我做错了什么?您可以使用
-
操作符和折叠键来删除
您正在使用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)
你不需要可变性
val keys_to_keep: List[String] = List("a", "b")
val res = content.someContent.map(
_.filterKeys(k => !keys_to_keep.contains(k))
)
filterKeys
通过针对条件测试每个条目的键来过滤Map
当然,重要的是要记住,您不能针对
字符串测试列表[Int]
上的包含的,因为结果总是错误的
此外,请尝试查找Scala的样式指南:
- 类通常以大写字母命名
- 值和变量通常以小写字母命名
以下是您的操作方法:
val optionalMap = someClass0.content.someContent.map {
contentMap => contentMap - keyToBeRemoved
}
val originalStructure = someClass0.copy(content = SomeClass1(optionalMap))
以下是这将删除所有键并保留结构
val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))
但我不仅有Map,还有Option[Map]。我尝试了val-mapWithoutKeys=keys\u-to\u-remove.foldLeft(content.someContent.get)
和get-justHashMap()
我得到了一些(MapView())(@MakarNikitin这意味着你的Map
正在使用MapView
实现。这是一个懒惰的实现,在你真正查询它们之前不会产生结果(例如,使用.apply(key)
)。我不仅需要筛选的映射,还需要所有父结构。@MakarNikitin我已经更新了我的答案以及到Scastie的链接。
val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))