正如问题中提到的“我们可以假设结果元组中的项目数是predetermined to be 4”,以下解决方案只返回所请求的元组:
给出的列表是:
var A= List((1,"A"), (2,"B"), (3,"C"))
var B= List((1,"AA"), (2,"BB"), (3,"CC"), (4,"DD"))
var C= List((1,"AAA"), (3,"CCC"))
在 Scala REPL 中:
scala> val list1 = List(A,B,C).flatten
list1: List[(Int, String)] = List((1,A), (2,B), (3,C), (1,AA), (2,BB), (3,CC), (4,DD), (1,AAA), (3,CCC))
scala> val list2 = List(A,B,C).flatten.map(x=>x._2.toArray).flatten.distinct
list2: List[Char] = List(A, B, C, D)
然后使用上面的two lists,可以得到所需的resultList,如下:
scala> val resultList =
list2.map(x=>list1.filter(y=>y._2.contains(x))).map{
case List() =>
case List((a,b)) => (a,b,"","")
case List((a,b),(_,c))=>(a,b,c,"")
case List((a,b),(_,c),(_,d)) =>(a,b,c,d)
}
resultList: List[Any] = List((1,A,AA,AAA), (2,B,BB,""), (3,C,CC,CCC), (4,DD,"",""))
但是,如果我们确实关心empty string "" 在each tuple 中的位置,代码会变得有点冗长,因为我们必须考虑pattern matching 中带有if 条件的case 语句中的所有组合,如下所示:
scala> val resultList =
list2.map(x=>list1.filter(y=>y._2.contains(x))).map{
case List() =>
case List((a,b)) if(b.size==1) => (a,b,"","")
case List((a,b)) if(b.size==2) => (a,"",b,"")
case List((a,b)) if(b.size==3) => (a,"","",b)
case List((a,b),(_,c)) if(b.size==1 && c.size==2)=>(a,b,c,"")
case List((a,b),(_,c)) if(b.size==2 && c.size==1)=>(a,c,b,"")
case List((a,b),(_,c)) if(b.size==1 && c.size==3)=>(a,b,"",c)
case List((a,b),(_,c)) if(b.size==3 && c.size==1)=>(a,c,"",b)
case List((a,b),(_,c)) if(b.size==2 && c.size==3)=>(a,"",b,c)
case List((a,b),(_,c)) if(b.size==3 && c.size==2)=>(a,"",c,b)
case List((a,b),(_,c),(_,d)) if(b.size==1&&c.size==2 && d.size==3)=>
(a,b,c,d)
case List((a,b),(_,c),(_,d)) if(b.size==1&&c.size==3 && d.size==2)=
(a,b,d,c)
case List((a,b),(_,c),(_,d)) if(b.size==2&&c.size==1&& d.size==3)=>
(a,c,b,d)
case List((a,b),(_,c),(_,d)) if(b.size==2&&c.size==3&& d.size==1)=>
(a,d,b,c)
case List((a,b),(_,c),(_,d)) if(b.size==3&&c.size==1&& d.size==2)=>
(a,c,d,b)
case List((a,b),(_,c),(_,d)) if(b.size==3&&c.size==2&& d.size==1)=>
(a,d,c,b)
}
resultList: List[Any] = List((1,A,AA,AAA), (2,B,BB,""), (3,C,CC,CCC), (4,"",DD,""))
但是应该注意的是,在使用元组进行此类操作时,类型信息将丢失并且难以使用生成的元组列表进行处理。改用 List 等其他数据结构可能会更好。但是,鉴于问题中提到的要求,这已解决。