我正在嘗試反轉以字串為鍵和一組數字為其值的映射
我的目標是創建一個串列,其中包含一個數字元組和一個在值集中具有相同數字的字串串列
到目前為止我有這個:
def flipMap(toFlip: Map[String, Set[Int]]): List[(Int, List[String])] = {
toFlip.flatMap(_._2).map(x => (x, toFlip.keys.toList)).toList
}
但它只是將每個 String 分配給每個 Int
val map = Map(
"A" -> Set(1,2),
"B" -> Set(2,3)
)
應該產生:
List((1, List(A)), (2, List(A, B)), (3, List(B)))
但正在生產:
List((1, List(A, B)), (2, List(A, B)), (3, List(A, B)))
uj5u.com熱心網友回復:
這適用于,但它并不完全是您可能需要的,您可能需要進行一些轉換才能獲得所需的確切資料型別:
toFlip.foldLeft(Map.empty[Int, Set[String]]) {
case (acc, (key, numbersSet)) =>
numbersSet.foldLeft(acc) {
(updatingMap, newNumber) =>
updatingMap.updatedWith(newNumber) {
case Some(existingSet) => Some(existingSet key)
case None => Some(Set(key))
}
}
}
我曾經Set避免在內部串列中重復鍵插入,并用于Map更好地查找而不是外部串列。
uj5u.com熱心網友回復:
// both scala2 & scala3
scala> map.flatten{ case(k, s) => s.map(v => (k, v)) }.groupMapReduce{ case(k, v) => v }{case(k, v) => List(k)}{ _ _ }
val res0: Map[Int, List[String]] = Map(1 -> List(A), 2 -> List(A, B), 3 -> List(B))
// scala3 only
scala> map.flatten((k, s) => s.map(v => (k, v))).groupMapReduce((k, v) => v)((k, v) => List(k))( _ _ )
val res1: Map[Int, List[String]] = Map(1 -> List(A), 2 -> List(A, B), 3 -> List(B))
uj5u.com熱心網友回復:
你可以這樣做:
def flipMap(toFlip: Map[String, Set[Int]]): List[(Int, List[String])] =
toFlip
.toList
.flatMap {
case (key, values) =>
values.map(value => value -> key)
}.groupMap(_._1)(_._2)
.view
.mapValues(_.distinct)
.toList
請注意,我個人會回傳 aMap而不是 aList
或者,如果您的范圍內有貓。
def flipMap(toFlip: Map[String, Set[Int]]): Map[Int, Set[String]] =
toFlip.view.flatMap {
case (key, values) =>
values.map(value => Map(value -> Set(key)))
}.toList.combineAll
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/486234.html
標籤:斯卡拉
下一篇:Scala增量更新物件欄位
