gpt4 book ai didi

arrays - 有效地遍历匹配 bool 条件的数组?

转载 作者:行者123 更新时间:2023-12-04 16:59:27 25 4
gpt4 key购买 nike

这是来自 Scala for the Impatient 的另一个问题其中说

Write a function lteqgt(values: Array[Int], v: Int) that returns a triple containing the counts of values less than v, equal to v, and greater than v.



我这样做的方式是
scala> def lteqgt(values: Array[Int], v: Int): (Int, Int, Int) = (values.count(_ < v), values.count(_ == v), values.count(_ > v))
lteqgt: (values: Array[Int], v: Int)(Int, Int, Int)

scala> lteqgt(Array(0,0,1,1,1,2,2), 1)
res47: (Int, Int, Int) = (2,3,2)

问题?
我正在遍历数组 3收集计数的次数,有没有办法在第一次收集值?一种惯用的方式?

最佳答案

这是使用 foldLeft 的完美案例.它将只遍历您的集合一次,而不会创建另一个集合(如 groupBy 所做的那样)并且与更通用的 aggregate 相比更简洁。 .

def lteqgt(values: Array[Int], v: Int): (Int, Int, Int) =
values.foldLeft((0, 0, 0)) {
case ((lt, eq, gt), el) =>
if (el < v) (lt + 1, eq, gt)
else if (el == v) (lt, eq + 1, gt)
else (lt, eq, gt + 1)
}

如果你想达到最终的效率,同时避免命令式方法,那么尾递归是要走的路:
def lteqgt(values: Array[Int], v: Int): (Int, Int, Int) = {
def rec(i:Int, lt:Int, eq:Int, gt:Int):(Int, Int, Int) =
if (i == values.length) (lt, eq, gt)
else if (values(i) < v) rec(i + 1, lt + 1, eq, gt)
else if (values(i) == v) rec(i + 1, lt, eq + 1, gt)
else rec(i + 1, lt, eq, gt + 1)
rec(0, 0, 0, 0)
}

这避免了施工 Tuple并在每次迭代中装箱 Ints。整个事情编译为 while java中的循环( here is the transpiled output 如果您有兴趣)。

关于arrays - 有效地遍历匹配 bool 条件的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217963/

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