scala映射按键获取值,键不区分大小写
我有一个map[String,Info]的映射,它包含的键可以是大写或小写,如下所示:scala映射按键获取值,键不区分大小写,scala,hashmap,Scala,Hashmap,我有一个map[String,Info]的映射,它包含的键可以是大写或小写,如下所示: person1: PersonInfo1 person2: PersonInfo2 PERSON1: PersonInfo1 我想获取键“person1”的值,如果没有找到,我将尝试使用键“person1”,我尝试了以下代码: val info = map.get(key) match { case Some(personInfo) => personInfo case None =>
person1: PersonInfo1
person2: PersonInfo2
PERSON1: PersonInfo1
我想获取键“person1”的值,如果没有找到,我将尝试使用键“person1”,我尝试了以下代码:
val info = map.get(key) match {
case Some(personInfo) => personInfo
case None =>
map.get(key.toUpperCase()) match {
case Some(personInfo) => personInfo
case None => None
}
}
但是这个返回信息是作为可序列化的产品类型返回的,我怎么能让信息作为PersonInfo类型返回呢?Scala中是否有一种方法允许我按键从映射中获取值,而忽略键的大小写 有用于排序地图的比较器,允许从地图案例中不敏感地获取。例如: 如果在所有情况下都返回选项,则可以解决实际问题,例如:
val info = map.get(key) match {
case somePi@Some(personInfo) => somePi
case None => map.get(key.toUpperCase()) match {
case Some(personInfo) => Some(personInfo)
case None => None
}
}
请注意用于引用表达式的somePi@
=>somePi部分或Some(personInfo)
可能值得解释一下为什么会出现此错误消息。我假设
personInfo
是一个case类
,它实现了产品
和可序列化
,就像无
一样。它们的常见类型是可序列化的产品
您获得可序列化的产品的原因是因为您的代码试图返回字符串
(如果键是好的)或选项
(即如果找不到键,无
)。这两种类型不兼容。您应该决定是否需要字符串
(如果找不到键,可能是空字符串)或选项
(即一些[字符串]
或无
)
看看这是否适合你。它返回一个选项[String]
map.get(key).fold(pm.get(key.toUpperCase))(Some(_))
第一个get()
返回一个选项。fold()
打开选项
并尝试第二个带大写键的get()
值,或者,如果第一个get
返回一个值,则该值将重新包装在选项
中,以便类型匹配
另一方面,如果您想返回一个字符串
,您可以这样做
map.getOrElse(key, pm.getOrElse(key.toUpperCase, ""))
您可以使用orElse
链接get。我将为此创建一个扩展方法:
implicit class CaseInsensitiveGetMap[V] (m: Map[String,V]) {
def iget (key: String): Option[V] = m.get(key)
.orElse(m.get(key.toUpperCase())) //you can add more orElse in chain
}
然后你可以像这样使用它:
map.iget("person2")
你可以做<代码>查找<代码>,而不是<代码>获取< /Cord>。但是,在执行此操作时,您可能需要考虑性能。
map.find(k => k._1.equalsIgnoreCase(key)) match {
case Some =>
case None =>
}
你能解释一下这是做什么的吗?它做了你试图做的事情,但是如果你的钥匙里有钥匙
,并且你要求钥匙
,它就不起作用了。如果找不到,它会使用所有大写字母进行询问,否则它会将从Some
中提取的找到的值包装在Some
中。
map.find(k => k._1.equalsIgnoreCase(key)) match {
case Some =>
case None =>
}