所以我有一個這樣的地圖串列
val data = List(
Map[String, String]("name" -> "Bob", "food" -> "pizza", "day" -> "monday"),
Map[String, String]("name" -> "Ron", "food" -> "hotdog", "day" -> "tuesday"),
Map[String, String]("name" -> "Tim", "food" -> "pizza", "day" -> "wednesday"),
Map[String, String]("name" -> "Carl", "food" -> "hotdog", "day" -> "wednesday")
)
我想從地圖串列中制作這樣的地圖
val result = Map("pizza" -> Map("name" -> ("Bob", "Tim"), "day" -> ("monday", "wednesday")),
"hotdog"-> Map("name" -> ("Ron", "Carl"), "day" -> ("tuesday", "wednesday")))
我怎樣才能達到這個結果?謝謝
*ps 我是 Scala 的初學者
uj5u.com熱心網友回復:
這是一個初步的解決方案,可能有一種更簡單的方法可以做到這一點,fold但我必須單獨勾勒出來
data.groupMap(a => a("food"))(_.filter(_._1 != "food"))
.map{
case (a,b) =>
(a, b.flatten.groupMapReduce(_._1)(a => List(a._2))(_ _))}
- 您根據以下值對里面的地圖進行分組
food
這給了你:
Map(
hotdog -> List(
Map(name -> Ron, food -> hotdog, day -> tuesday),
Map(name -> Carl, food -> hotdog, day -> wednesday)),
pizza -> List(
Map(name -> Bob, food -> pizza, day -> monday),
Map(name -> Tim, food -> pizza, day -> wednesday))
)
- 您
food從內部地圖中洗掉密鑰
Map(
hotdog -> List(
Map(name -> Ron, day -> tuesday),
Map(name -> Carl, day -> wednesday)),
pizza -> List(
Map(name -> Bob, day -> monday),
Map(name -> Tim, day -> wednesday))
)
您使用
groupMapReducewhich “合并”里面的地圖a) 按內鍵分組(即
name和day)b) 將每個值映射到一個單例串列
c) 連接串列
編輯:這是一個使用的單通道解決方案,foldLeft但我認為我不喜歡這個更好。所有的密鑰訪問都是不安全的,如果您的條目丟失了密鑰,將會爆炸。因此,理想情況下,您需要使用.get()來取回一個選項并進行大量模式匹配
data.foldLeft(Map[String, Map[String, List[String]]]())((b, a) => {
val foodVal = a("food")
b.get(foodVal) match{
case None => b (foodVal ->
List("name" -> List(a("name")), "day" -> List(a("day"))).toMap)
case Some(v : Map[String, List[String]]) =>
b (foodVal ->
List("name" -> (v("name") : a("name")), "day" -> (v("day") : a("day"))).toMap)
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405124.html
標籤:
上一篇:回傳前更改串列值-scala
