2016-09-15 58 views
1

特定的事件列表我有我试图分裂成单独的列表顺序字符串列表,分组第四发生即此列表:集团在斯卡拉

val data = List("1", "2", "3", "4", "5", "6", "7", "8") 

应该被归类为

val list1 = List("1", "5") 
val list2 = List("2", "6") 
val list3 = List("3", "7") 
val list4 = List("4", "8") 

我不知道如果我想这个过于复杂,但我能想到的唯一办法是先用组例如sliding的元素:

data.sliding(4,4).toList 

导致

List(List(1, 2, 3, 4), List(5, 6, 7, 8)) 

,然后实现我自己unzip方法,该方法将基的上述作为我的希望的输出。

请有人让我知道是否有一个更简单的方法做到这一点?

+0

这将是巨大的,如果您可以确认超过8个元素的列表的预期行为...... –

回答

3

,可以在列表.sliding上使用.transpose产生:

scala> val data = List("1", "2", "3", "4", "5", "6", "7", "8") 
data: List[String] = List(1, 2, 3, 4, 5, 6, 7, 8) 

scala> data.sliding(4, 4).toList 
res1: List[List[String]] = List(List(1, 2, 3, 4), List(5, 6, 7, 8)) 

scala> data.sliding(4, 4).toList.transpose 
res2: List[List[String]] = List(List(1, 5), List(2, 6), List(3, 7), List(4, 8)) 
0

zipsliding

scala> val data = List("1", "2", "3", "4", "5", "6", "7", "8") 
data: List[String] = List("1", "2", "3", "4", "5", "6", "7", "8") 

scala> val result = data.sliding(4, 4).toList 
result: List[List[String]] = List(List("1", "2", "3", "4"), List("5", "6", "7", "8")) 

scala> result.transpose 
res7: List[(String, String)] = List(("1", "5"), ("2", "6"), ("3", "7"), ("4", "8")) 
+0

只有当列表中有8个元素时,这才会起作用。 –

0

如果元组会做的输出,这是相当整洁:

val tuples = data zip data.drop(4) 
//> tuples : List[(String, String)] = List((1,5), (2,6), (3,7), (4,8)) 

转他们到List

tuples.map{case(a,b) => List(a, b)} 
//> List[List[String]] = List(List(1, 5), List(2, 6), List(3, 7), List(4, 8)) 

编辑:显示,大约只有8个工作的评论是不正确

def pairs[A](xs:List[A], n:Int) = 
(xs zip xs.drop(n)).map{case(a,b) => List(a, b)} 

pairs(List("1","2", "3", "4", "5", "6", "7", "8"), 4) 
// List(List(1, 5), List(2, 6), List(3, 7), List(4, 8)) 
pairs(List("1","2", "3", "4", "5", "6", "7", "8", "9"), 4) 
// List(List(1, 5), List(2, 6), List(3, 7), List(4, 8), List(5, 9)) 

pairs(List("1","2", "3", "4", "5", "6", "7", "8", "9", "10"), 4) 
// List(List(1, 5), List(2, 6), List(3, 7), List(4, 8), List(5, 9), List(6, 10)) 
pairs(List("1","2", "3", "4"), 4) 
// List() 
pairs(List("1","2", "3"), 4) 
// List() 
+0

这个答案也需要'数据'正好有8个元素。 –

+0

我不知道你为什么这么说,因为它不是真的。 –

+0

如果您有例如(List(1,5),List(2,6),List(3,7),List(4,8),List(5,9))返回'data =(1至12).toList' ),...)';它不是像问题中那样“分解成单独的列表”,因为你的结果相交。如果'data =(1到4).toList',则返回一个空列表。 –

2

一个版本,它会为每个列表长度工作:

def groupNth[A](n: Int, list: List[A]): List[List[A]] = { 
    val (firstN, rest) = list.splitAt(n) 
    val groupedRest = if (rest.nonEmpty) groupNth(n, rest) else Nil 
    // null.asInstanceOf[A] is of course cheating, but the value is never used 
    firstN.zipAll(groupedRest, null.asInstanceOf[A], Nil).map { 
    case (h, t) => h :: t 
    } 
} 


println(groupNth(4, Nil)) 
// List() 
println(groupNth(4, List(1, 2, 3))) 
// List(List(1), List(2), List(3)) 
println(groupNth(4, List(1, 2, 3, 4, 5, 6, 7, 8))) 
// List(List(1, 5), List(2, 6), List(3, 7), List(4, 8)) 
println(groupNth(4, List(1, 2, 3, 4, 5, 6, 7, 8, 9))) 
// List(List(1, 5, 9), List(2, 6), List(3, 7), List(4, 8)) 
println(groupNth(4, List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))) 
// List(List(1, 5, 9), List(2, 6, 10), List(3, 7, 11), List(4, 8, 12))