2017-03-15 107 views
-1

比方說,我有如下所示的數組:如何將一個scala數組中的連續整數分組?

1 2 3 4 5 6 7 8 9 1 2 3 4 5 1 2 3 4 

我要連續編號的多個子陣列的每個連續對的,其總和小於10

1 2 3 4 5, 6, 7, 8, 9, 1 2 3 4 5 1 2 3 4 

如何編寫它在功能習慣方式的斯卡拉?

// example no. 1 
>Array(1, 2, 3, 4, 5, 6)...??? 
res0: List(Array(1, 2, 3, 4, 5), Array(6)) 
// example no. 2 
>Array(3, 8, 1, 9, 1, 3)...??? 
res1: List(Array(3), Array(8, 1), Array(9), Array(1, 3)) 
+0

它與反應x和類別理論有什麼關係? – adamwy

+0

它可以用反應x或類別理論解決 – gurghet

+0

我看不出任何相關性。目前還不清楚你想達到什麼目的,你想分割數組到低於或高於給定的閾值? – adamwy

回答

1

做一個foldRight使得它更容易使用headtail建設所產生的List

val grouped = Array(3,8,1,9,1,3).foldRight(List.empty[Array[Int]]){case (n,acc) => 
    if (acc.isEmpty) List(Array(n)) 
    else if (acc.head.head + n < 10) n +: acc.head :: acc.tail 
    else Array(n) :: acc 
} // List(Array(3), Array(8, 1), Array(9), Array(1, 3)) 
+0

酷!謝謝 :) – gurghet

0

這應該工作(雖然這是一個非常低效的方式):

def group(threshold: Int)(seq: Seq[Int]): Seq[Seq[Int]] = 
    seq.reverse.tails.find(_.sum < threshold) match { 
    case None => Nil 
    case Some(Nil) => Nil 
    case Some(subSeq) => 
     subSeq.reverse +: group(threshold)(seq.drop(subSeq.size)) 
    } 

group(10)(Array(3, 8, 1, 9, 1, 3)) 
List(Array(3), Array(8, 1), Array(9), Array(1, 3)) 
相關問題