2016-01-26 44 views
2

我想看起來像這樣的數據轉換:轉換被地圖[字符串,序號[INT]]以序列[序列[INT]]

val inputData = 
    Seq(("STUDY1", "Follow-up", 1), 
    ("STUDY1", "Off Study", 2), 
    ("STUDY1", "Screening", 3), 
    ("STUDY1", "Treatment", 4), 
    ("STUDY2", "Follow-up", 5), 
    ("STUDY2", "Off Study", 6), 
    ("STUDY2", "Screening", 7), 
    ("STUDY2", "Treatment", 8)); 

到的數據,看起來像這樣:

val desiredData = 
    Seq(Seq(1,2,3,4), 
    Seq(5,6,7,8)); 

,我已經得到的最接近的是這樣的:

val result: Map[String, Seq[Int]] = 
    data.groupBy(i => i._1) 
    .mapValues(j => j.map(k => k._3)) 
    .mapValues(_.toArray) 

result.values.toSeq 

這產生了:

res0: Seq[Seq[Int]] = Stream(WrappedArray(1, 2, 3, 4), ?) 

最後一個問號就是把我扔了一圈。

編輯 未來互聯網誰在這裏降落的旅客:我的代碼實際上工作......我的困惑,從理解什麼?是所有關於朵朵。從下面的人的答案幫助我看到,mapValues做了懶惰的評估,並且?只是暗示。

+1

請注意,您的'desiredData'有一點誤導。我假設你想要Seq(Seq(1,2,3,4),Seq(5,6,7,8))'。 (你現在擁有的類型是:'Seq [(Int,Int,Int,Int)]'而不是'Seq [Seq [Int]]') – gzm0

+0

@ gzm0謝謝你的注意。它現在已經修復。 –

+0

堅持下去,「扔我一個循環」是什麼意思?這是實際循環還是你不明白在這種情況下'?'的含義?我試過這個,它不會循環(在2.11.7)。所以'''基本上意味着流的尾部被懶惰地評估並且不在這裏評估(這是爲了防止在無限流的情況下的無限循環)。 – gzm0

回答

5

mapValuesMap是懶惰的(不像其他方法在默認Map上)。所以這可能是那裏的問題。您是否嘗試過:

data.groupBy(_._1).map(_._2.map(_._3).toArray) 

注意,toArray完全是可選在這裏。

3
val result: List[Seq[Int]] = 
    data.groupBy(_._1).mapValues(_.map(_._3)).values.toList 
+0

你能解釋爲什麼這個工作和OP的不? – gzm0

相關問題