scala map 通过键获取值,键不区分大小写

标签 scala hashmap

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

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 中有没有一种方法可以让我通过键从 map 中获取值并忽略键的大小写?

最佳答案

有用于排序 map 的比较器,允许不区分大小写地从 map 中获取。示例:https://scastie.scala-lang.org/PfHTh16CROag7PNrknx1sQ

val map = scala.collection.immutable.SortedMap("key1" -> 45, "Key2" -> 43, "KEY3" -> 42)(scala.math.Ordering.comparatorToOrdering(String.CASE_INSENSITIVE_ORDER))
map.get("key1") // Some(45)
map.get("key2") // Some(43)
map.get("key3") // Some(42)
map.get("key4") // None

如果您在所有情况下都返回 Options,则可以解决您的实际问题,例如:
      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) 的部分.

大概值得解释为什么您收到此错误消息。我假设 personInfocase class实现 ProductSerializable ,就像 None .它们的常见类型是 Product with Serializable .

关于scala map 通过键获取值,键不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56141938/

相关文章:

scala - 使用新的Scala反射API的“动态”方法调用

php - 您能向 PHP 人员解释 Perl 的哈希系统吗?

java - 根据某些规范创建 HashMap 的子集?

android - 从自定义适配器获取 Hashmap 项

java - O(1) 的映射同时搜索键和值

java - 去除重复输出

scala - 如何使用 scala 代码在 Play framework 2.3.x 中启用 HSTS?

algorithm - 如何使我的快速选择算法更快

scala - SBT 从子项目运行 Main 方法

java - 为两个方法插入 scala 代码