鑒于以下地圖串列(串列可能更長):
List(
Map[String,String]("wind"->"none", "rain"->"none", "class"->"on time"),
Map[String,String]("wind"->"none", "rain"->"slight", "class"->"on time"),
Map[String,String]("wind"->"none", "rain"->"slight", "class"->"late"),
...
)
我怎樣才能對我有這樣的地圖進行分組:
"on time" -> ("wind"->"none", "rain"->"none", "wind"->"none", "rain"->"slight")
"late" -> ("wind"->"none", "rain"->"slight")
我被困在幾張地圖上。
uj5u.com熱心網友回復:
另外一個選擇:
val maps =
List(
Map[String, String]("wind" -> "none", "rain" -> "none", "class" -> "on time"),
Map[String, String]("wind" -> "none", "rain" -> "slight", "class" -> "on time"),
Map[String, String]("wind" -> "none", "rain" -> "slight", "class" -> "late"),
Map[String, String]("wind" -> "none", "rain" -> "slight")
)
val grouped = maps.foldLeft(Map.empty[String, List[(String, String)]]) {
case (acc, map) if map.contains("class") =>
val key = map("class")
if (acc.contains(key))
acc.updated(key, acc(key) (map - "class").toList)
else
acc (key -> (map - "class").toList)
case (acc, _) => acc
}
uj5u.com熱心網友回復:
在香草 Scala 中2.12\2.11假設起點:
val maps =
List(
Map[String, String]("wind" -> "none", "rain" -> "none", "class" -> "on time"),
Map[String, String]("wind" -> "none", "rain" -> "slight", "class" -> "on time"),
Map[String, String]("wind" -> "none", "rain" -> "slight", "class" -> "late")
)
你可以折疊所有東西:
maps
.filter(_.contains("class")) // guarantee "class" key exists
.map(m => m("class") -> (m - "class").toList)
.foldLeft(Map.empty[String, List[(String, String)]]) {
case (acc, (key, values)) if acc.contains(key) =>
acc.updated(key, acc(key) values)
case (acc, (key, values)) =>
acc ((key, values))
}
這個邏輯對于任何輸入都是安全的,因為它會在Map[_,_]沒有class鍵的情況下過濾掉。您可以洗掉它.map(..)并在fold.
如果你能保證輸入是非空的并且包含class你可以使用的鍵,reduceLeft而不是foldLeft并洗掉filter.
獎勵邏輯與Iterator[_]以下兼容:
maps
.iterator
.filter(..)
.map(..)
.foldLeft(..)(..)
}
uj5u.com熱心網友回復:
這是解決問題的一種方法。(斯卡拉 2.13.x)
val maps = List(...)
val rslt = maps.groupMap(_("class"))(_ - "class")
.map{case (k,v) => k -> v.flatten}
我知道map()可以將呼叫簡化為 amapValues()但在 2.13 中已棄用,因此我不使用它。
當然,如果Map在List沒有"class"鍵的情況下有任何元素,這將在運行時拋出。
斯卡拉 2.11 版本:
maps.groupBy(_.getOrElse("class","no-class"))
.mapValues(_.flatMap(_ - "class"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394714.html
上一篇:Akka將websocket流內容流式傳輸到Sink.seq以例外SubscriptionWithCancelException$StageWasCompleted結束
