簡體   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