2016-09-15 57 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))