gpt4 book ai didi

list - 如何使用 foldLeft 从列表中找到值的位置?

转载 作者:行者123 更新时间:2023-12-04 02:10:34 25 4
gpt4 key购买 nike

我有一个包含 1 和 -1 的列表。我追求的目标是在总数为 -1 时找到 List 中的位置。

List[Int] = List(1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 
-1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1)

但是我的代码不起作用。

这是我的尝试(我将代码隔开以便更好地阅读)注意: floor是保存整数列表的 val。
floor.foldLeft(0) { ( (x,y) => x+y == -1 ) }.indexOf(-1)

floor.foldLeft(0) ( (x,y) => { (x + y == -1) {x.indexOf(-1)} } )

floor.foldLeft(0) { (x,y) => { if (x + y == -1) { indexOf(-1) } } }

我想知道我在这里做错了什么。我真的更关心为什么而不是答案本身。

最佳答案

匿名函数( foldLeft 的第二个参数)需要返回与第一个参数相同的类型。
foldreduce家庭旨在获取集合并将其减少为单个值。在这里对你不起作用。

这会让你得到你想要的。

floor.scanLeft(0)(_+_).indexOf(-1) - 1  // scan collection is 1 element longer

在这种情况下 scan生成具有不同属性/值的新集合,可以查询感兴趣的元素。

所以如果你真的需要使用 foldLeft , 尝试这个。
floor.zipWithIndex.foldLeft((0,-1)) {
case ((s,x),(e,i)) => if (s+e == -1 && x < 0) (0,i) else (s+e, x)
}._2

非常难看,因为您必须携带当前金额, s ,以及您所在位置的索引, i ,以及正在评估的当前元素, e ,找到目标后, x ,你必须把它留在身边并在最后打开它, ._2 .

将结果与 scanLeft 进行比较版本。我想你会发现最后的 - 1需要调整。

这是另一种方法,如果/当达到所需目标时,它的好处是尽早退出。
val floorSums:Stream[Int] = Stream.tabulate(floor.length){ idx =>
floor(idx) + (if (idx>0) floorSums(idx-1) else 0)
}

floorSums.indexOf(-1) // 38

关于list - 如何使用 foldLeft 从列表中找到值的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38885659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com