我正在寻找一种转换元组列表的好方法,例如
List((a,b,c,d,e,f),(a,b,c,g,h,i))
类似
(a,b,c,List((d,e,f),(g,h,i)))
列表可能非常大,最多1000个元组,元组有20个字段,数据类型为字符串和整数。
到目前为止,我已经找到了以下内容:
val l = List(("a","b","c","d","e","f"),("a","b","c","g","h","i"))
val l2= l.groupBy(x =>(x._1, x._2, x._3))
//Map((a,b,c) -> List((a,b,c,d,e,f), (a,b,c,g,h,i)))
val l3 = l2.map{case (k,v) =>(k._1, k._2, v.map{y =>(y._4,y._5)})}
//List((a,b,List((c,d,e), (c,g,h))))
但它很丑陋,看起来好像不适合大型名单
答案 0 :(得分:0)
使用元组执行此操作并非易事。我建议查看HList
实现。
假设所有项目属于同一类型,您可以将输入定义为:
val input: List[Set[Symbol]] = List(
Set('a, 'b, 'c, 'd, 'e, 'f),
Set('a, 'b, 'c, 'g, 'h, 'i)
)
然后使用Set's intersection & difference计算结果:
val output: (Set[Symbol], List[Set[Symbol]]) = {
val intersection = input.reduce(_ & _)
val differences = input.map(_ &~ intersection)
(intersection, differences)
}
结果将是:
(Set('a, 'b, 'c), List(Set('e, 'f, 'd), Set('i, 'g, 'h)))
答案 1 :(得分:0)
使用shapeless,它的一行解决方案
import shapeless.syntax.std.tuple._
val l = List(("a", "b", "c", "d", "e", "f"), ("a", "b", "c", "g", "h", "i"))
l(0).take(3) :+ l.map(_.drop(3))
//res0: (String, String, String, List[(String, String, String)]) =
(a,b,c,List((d,e,f), (g,h,i)))