我有這些元組:
("T1",2,"x1"),
("T1",2,"x2"),
// … etc
我想把它減少到("T1", 4, List("x1", "x2")). 我怎樣才能做到這一點 ?
我做了類似的事情,.group(_._1).map{case (key,list) => key-> list.map(_._2).reduce(_ _)}
但這不起作用,只是對數字求和而不附加串列。
uj5u.com熱心網友回復:
與groupMapReduce:
val xs = List(
("T1",40,"x1"),
("T1",2,"x2"),
("T2",58,"x3")
)
println(xs.groupMapReduce(_._1)
(e => (e._2, List(e._3)))
({ case ((x, y), (z, w)) => (x z, y w)})
)
與groupBy:
val xs = List(
("T1",40,"x1"),
("T1",2,"x2"),
("T2",58,"x3")
)
println(xs.groupBy(_._1)
.view
.mapValues(ys => (ys.view.map(_._2).sum, ys.map(_._3)))
.toMap
)
如果您想在每個串列中一次性完成,而不是使用 ,您可以嘗試某事。像這樣:
xs.groupBy(_._1)
.view
.mapValues(ys =>
ys.foldRight((0, List.empty[String])){
case ((_, n, x), (sum, acc)) => (n sum, x :: acc)
}
)
.toMap
所有三種變體都給出
Map(T2 -> (58,List(x3)), T1 -> (42,List(x1, x2)))
請注意, 如果串列數量變大,將多個串列組合在一起可能會變得非常低效。這是否可以接受取決于您的用例。
uj5u.com熱心網友回復:
使用foldLeft
val tuples = List(
("T1",2,"x1"),
("T1",2,"x2"),
("T2",2,"x1"),
("T2",2,"x2"),
("T3",2,"x1")
)
tuples.foldLeft(Map.empty[String, (Int, List[String])]){ (acc, curr) =>
acc.get(curr._1).fold(acc (curr._1 -> (curr._2, List(curr._3)))) { case (int, ls) =>
acc (curr._1 -> (int curr._2, (curr._3 :: ls).reverse))
}
}
uj5u.com熱心網友回復:
如果您的范圍內有貓,您需要做的就是:
import cats.data.Chain
import cats.syntax.all._
def combineTripletes(data: List[(String, Int, String)]): Map[String, (Int, List[String])] =
data.foldMap {
case (key, i, str) =>
Map(key -> (i, Chain.one(str)))
} fmap {
case (sum, chain) =>
sum -> chain.toList
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/515734.html
標籤:斯卡拉映射减少信息检索
