爲了方便,我已經爲取代的INTS的日期,但prinicpal是一樣的。
val data = List(
("a","a", 10),
("a","b", 30),
("a","b", 11),
("a","b", 33),
("s","c", 37),
("a","c", 26),
("a","d", 22),
("m","a", 18),
("t","a", 15)
)
val sortedData = data.sortWith ((a,b)=> a._3 < b._3)
println(s"$sortedData")
val splitPass = sortedData.foldLeft(List[(String, String,Int)](), List[List[(String, String,Int)]](), sortedData.head._3){
case ((cl, acc, ld),nt) =>
if (nt._3-ld>3)
(List(nt), cl.reverse ::acc, nt._3)
else
(nt:: cl, acc, nt._3)
}
val (fl, fa, _) = splitPass
val res = (if (fl.isEmpty) fa else fl :: fa).reverse
println(s"$res")
這給排序列表:
List((a,a,10), (a,b,11), (t,a,15), (m,a,18), (a,d,22), (a,c,26), (a,b,30), (a,b,33), (s,c,37))
和結果列表:
List(List((a,a,10), (a,b,11)), List((t,a,15), (m,a,18)), List((a,d,22)), List((a,c,26)), List((a,b,30), (a,b,33)), List((s,c,37)))
這樣做什麼是單次通過排序列表,建立由累加器(當前組中的項目列表,已完成組列表,最後添加項目的Int [日期])。這是播種兩個空列表和列表中的第一個項目的日期。
對於源列表中的每個項目,如果它接近前一個項目,則將其添加到當前組,如果它遠離前一項目,則當前組將關閉並添加到已完成的gorups列表中,並且當前項目變成新列表中的第一項,並且當前項目的日期成爲下一次檢查的參考日期。如果你想打破日期不同於當前組中最早的日期,很容易改變else分支來傳遞ld而不是nt._3。
最後,您需要將任何未完成的組添加到組的最終集合中。
這兩個'.reverse'是必需的,因爲這些列表在典型的功能風格中是倒退的(因爲它更便宜),並在完成時倒過來。
你可以給不同情況下的預期輸出嗎? –
使用'sortBy(_._ 3)'而不是'sortWith' – dhg
val sorted = List(l.sortBy(_._ 3)) – aravindKrishna