2017-07-17 7 views
-1

正の整数のシーケンスを持つ場合、その要素がしきい値以下になるまで要素の右側からシーケンスを分割する必要があります。例えば、累積結果が条件を満たしたときに右からSeqを分割します。

val seq = Seq(9,8,7,6,5,4,3,2,1) 

しかしながら、それらは二次又は線形しかし複雑いずれかであり、閾値は10であるので、結果は、私は逆後dropWhilescanLeftを試み

Seq(9,8,7,6,5) and Seq(4,3,2,1) 

あります。私たちのシーケンスは非常に長いかもしれませんが、通常、しきい値は小さく、右側からの要素は非常に少なくなります。私はそれを行うためのより良い、線形方法があるかどうか疑問に思っています。

+0

何よりも優れていますか?あらかじめあなたのアプローチを常に提示する必要があります – greenshade

答えて

0

これは、しきい値に達するとすぐに停止します。残念ながら、それは復帰するためにリターンを使用します。

val seq = Seq(9,8,7,6,5,4,3,2,1) 
val threshold = 10 

def processList(): (Seq[Int], Int) = { 
    seq.foldRight((Seq[Int](), 0)) { 
    case (elem, (acc, total)) => 
     if (total + elem <= threshold) { 
     (elem +: acc, total + elem) 
     } else { 
     return (acc, total) 
     } 
    } 
} 

processList() 
0

ビルトインメソッドでこれを行うための素晴らしい方法がありませんように見えますが、あなたはそれを自分で実装することができます。

def splitRightCumulative[A, B](xs: Seq[A])(start: B)(f: (B, A) => B, cond: B => Boolean): (Seq[A], Seq[A]) = { 
    def _loop(current: B, xs: Seq[A], acc: Seq[A]): (Seq[A], Seq[A]) = { 
     val next = f(current, xs.head) 
     if (cond(next)) { 
     _loop(next, xs.tail, xs.head +: acc) 
     } else { 
     (xs.reverse, acc) 
     } 
    } 
    _loop(start, xs.reverse, Seq.empty) 
    } 

    val xs = List(9, 8, 7, 6, 5, 4, 3, 2, 1) 
    val (left, right) = splitRightCumulative(xs)(0)(_ + _, _ <= 10) 

ます場合には、第2の型パラメータ(B)が必要ではないかもしれませんあなたのコレクションに入っているものと同じタイプが常に蓄積されています。

関連する問題