[英]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.