Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala映射按键获取值,键不区分大小写_Scala_Hashmap - Fatal编程技术网

scala映射按键获取值,键不区分大小写

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 =>

我有一个map[String,Info]的映射,它包含的键可以是大写或小写,如下所示:

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 =>
}