繁体   English   中英

如何将地图列表转换为 Scala 中的地图?

[英]How to convert a list of maps into maps in Scala?

我有一个像这样的Map

val map: Map[String, Any] = Map(
  "Item Version" -> 1.0,
  "Item Creation Time" -> "2019-04-14 14:15:09",
  "Trade Dictionary" -> Map(
    "Country" -> "India",
    "TradeNumber" -> "1",
    "action" -> Map(
      "Action1" -> false
    ),
    "Value" -> "XXXXXXXXXXXXXXX"
  ),
  "Payments" -> Map(
    "Payment Details" -> List(
      Map(
        "Payment Date" -> "2019-04-11",
        "Payment Type" -> "Rej"
))))   

我写了一段代码:

def flattenMap(map: Map[String, Any]): Map[String, Any] = {
  val c = map.flatten {
    case ((key, map : Map[String, Any])) => map
    case ((key, value)) => Map(key -> value)
    // case ((key, List(map))) =>
  }.toMap
  return c
}

def secondFlatten(map: Map[String, Any]): Map[String, Any] = {
  val c=map.flatten {
    case ((key, map : Map[String, Any])) => flattenMap(map)
    case ((key, value)) => Map(key -> value)
  }.toMap

  return c 
}

这给了 output 像这样:

(Country, India)
(Action1, false)
(Value, XXXXXXXXXXXXXXX)
(Item Version, 1.0)
(TradeNumber, 1)
(Item Creation Time, 2019-04-14 14:15:09)
(Payment Details, List(Map(Payment Date -> 2019-04-11, Payment Type -> Rej)))

我想进行一些代码更改,在其中我可以将地图列表转换为 map,例如 output,即代替(Payment Details,List(Map(Payment Date -> 2019-04-11, Payment Type -> Rej))) ,我应该得到:

(Payment Date , 2019-04-11), 
(Payment Type , Rej)

对于您的特定情况,您可以更新您的flattenMap方法:

def flattenMap(map: Map[String, Any]): Map[String, Any] = {
  val c = map.flatten {
    case ((key, map : Map[String, Any])) => map
    case ((key, value)) => Map(key -> value)
    case ((key, map :: Nil)) => map
  }.toMap
  return c
}

如果您想处理多个地图的列表,您可能应该将返回的值包装到列表中,因此使用某种flatMap而不是toMap

您应该处理您的 map 列表。 根据您提供的示例,我已将您的方法更新为:

def secondFlatten(map: Map[String, Any]):Map[String, Any]={
 map.flatten {
   case ((key, map : Map[String, Any])) => {
     map.flatten {
       case ((key: String, l: List[Map[String, Any]])) => l.head
       case ((key: String, m : Map[String, Any])) => m
       case (key: String, value: String) => Map(key -> value)
     }
   }
   case ((key, value)) => Map(key -> value)
 }.toMap
}

这可能对您在评论中提出的问题有用。 它将所有键附加在一起,并将值保存在 map 中。 如果您需要更复杂的解决方案,您可以进一步扩展它:

  def secondFlatten(map: Map[String, Any]):Map[String, Any]={
   map.flatten {
     case ((key, map : Map[String, Any])) => {
       map.flatten {
         case ((innerKey: String, l: List[Map[String, Any]])) => l.head.map{case (x:String, y: Any)=> (s"$key--$innerKey--$x"-> y)}
         case ((innerKey: String, m : Map[String, Any])) => m.map{case (x:String, y: Any)=> (s"$key--$innerKey--$x"-> y)}
         case (innerKey: String, value: String) => Map(s"$key--$innerKey"-> value)
    }
  }
  case ((key, value)) => Map(key -> value)
}.toMap

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM