将具有重复项的元组列表转换为具有嵌套元组的元组

时间:2015-05-04 09:21:47

标签: scala

我正在寻找一种转换元组列表的好方法,例如

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))))

但它很丑陋,看起来好像不适合大型名单

2 个答案:

答案 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)))