如何从 Option Scala 中的 Map 中删除键
How to delete key from Map in Option Scala
假设我有这样的案例 类。
case class someClass0(content: someClass1)
case class someClass1(someContent: Option[Map[String, someClass2]])
case class someClass2(someKey: Array[Int])
我需要按值删除 Map(不可变)中的项目。
这个值是我通过迭代得到的。
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)
不工作。
我做错了什么?
您可以使用 -
运算符和键上的 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)
你不需要可变性。
val keys_to_keep: List[String] = List("a", "b")
val res = content.someContent.map(
_.filterKeys(k => !keys_to_keep.contains(k))
)
filterKeys
通过根据条件测试每个条目的键来过滤 Map
。
当然,重要的是要记住,您不能在 List[Int]
上针对 Strings
测试 contains
,因为结果总是错误的。
此外,尝试查找 Scala 的风格指南:
- 类通常以大驼峰命名
- 值和变量通常以小驼峰命名
你可以这样做:
val optionalMap = someClass0.content.someContent.map {
contentMap => contentMap - keyToBeRemoved
}
val originalStructure = someClass0.copy(content = SomeClass1(optionalMap))
这是Scastie
这将删除所有键并保留结构
val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))
假设我有这样的案例 类。
case class someClass0(content: someClass1)
case class someClass1(someContent: Option[Map[String, someClass2]])
case class someClass2(someKey: Array[Int])
我需要按值删除 Map(不可变)中的项目。
这个值是我通过迭代得到的。
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)
不工作。
我做错了什么?
您可以使用 -
运算符和键上的 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)
你不需要可变性。
val keys_to_keep: List[String] = List("a", "b")
val res = content.someContent.map(
_.filterKeys(k => !keys_to_keep.contains(k))
)
filterKeys
通过根据条件测试每个条目的键来过滤 Map
。
当然,重要的是要记住,您不能在 List[Int]
上针对 Strings
测试 contains
,因为结果总是错误的。
此外,尝试查找 Scala 的风格指南:
- 类通常以大驼峰命名
- 值和变量通常以小驼峰命名
你可以这样做:
val optionalMap = someClass0.content.someContent.map {
contentMap => contentMap - keyToBeRemoved
}
val originalStructure = someClass0.copy(content = SomeClass1(optionalMap))
这是Scastie
这将删除所有键并保留结构
val someClass0_copy = someClass0.copy(content = Content(someContent = someClass0.content. someContent.map(_.removedAll(keysToRemove)))