-2

限制 foldLeft 中的迭代次数。我想根据特定条件终止 foldLeft 的迭代。条件是从不同的变量而不是从列表元素评估的。

我尝试使用 takeWhile 来限制迭代;但是 takeWhile 的谓词作用于列表的元素而不是外部值。

val numberList = List (1.0, 2.0, 3.0, 4.5, 5.5)
var sampleList = List [Double]()
var sum = 0.0
val sumLimit = 6.0 
var param = (sampleList, sum, sumLimit)
var filteredList = numberList.foldLeft(param) {
    (p, element) => {
        if (p._2 < p._3) {
            sampleList = p._1 :+ element
            (sampleList, p._2 + element, p._3)
        } else {
            (p._1, p._2, p._3)
        }
    }
}

以上代码迭代5次;但是我希望它在 (p._2 < p._3) 时进行迭代。上面的代码应该返回它正在执行的以下双精度列表(1.0、2.0、3.0);但是我想限制迭代次数。

4

1 回答 1

1

由于预定义的折叠是无状态的,因此短路不会真正起作用。因此,普通递归(其中折叠是简写)或迭代似乎更接近您想要的:

def f(p, lst, acc) = ??? //your function
var filteredList = f(p,numberList,Nil)
于 2019-06-26T00:17:23.203 回答