如何在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 
}

哪个给出这样的输出:

(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)))

我想进行一些代码更改,在其中我可以将地图列表转换为类似于输出的地图,即,我应该得到:

I want make some code changes in which I can convert the list of maps to a map like the output, i.e. instead of (Payment Details,List(Map(Payment Date -> 2019-04-11, Payment Type -> Rej))), I should get:

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

您应处理地图列表.根据您提供的示例,我已将您的方法更新为:

You should handle your list of map. Based on example you provided, I've updated your method to this:

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
}

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

This might be something that might be useful for your question in the comment. It appends all keys together and keeps value in the map. You could further extend it should you need more complex solution:

  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

}