在Swift中使用嵌套reduce函数

5

我有一个包含Double数组的数组,就像屏幕截图中所示:

enter image description here

我的目标是获取每个数组中所有Double元素的乘积之和。也就是说,我想要将每个数组的所有元素相乘,然后得到3个值,最后将它们相加。

我想使用reduceflatMap或者其他优雅的解决方案。

我尝试了什么?

totalCombinations.reduce(0.0) { $0 + ($1[0]*$1[1]*$1[2])  }

但是这仅适用于我知道包含双精度数的数组的大小的情况。
3个回答

8

考虑到这些值

let lists: [[Double]] = [[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]]

让我们来看几种可能的方法。

解决方案#1

let sum =  lists.reduce(0) { $0 + $1.reduce(1, combine: *) }

解决方案 #2

如果您定义了这个扩展名

extension SequenceType where Generator.Element == Double {
    var product : Double { return reduce(1.0, combine: *) }
}

那么,您可以编写

let sum = lists.reduce(0) { $0 + $1.product }

解决方案 #3

使用上述定义的扩展程序,您还可以编写以下内容:

let sum = lists.map { $0.product }.reduce(0, combine:+)

解决方案 #4

如果我们定义这两个后缀运算符

postfix operator +>{}
postfix func +>(values:[Double]) -> Double {
    return values.reduce(0, combine: +)
}

postfix operator *>{}
postfix func *>(values:[Double]) -> Double {
    return values.reduce(1, combine: *)
}

我们可以编写代码。
lists.map(*>)+>

2
你可以写出类似这样的内容:
let totalCombinations: [[Double]] = [
    [2.4,1.45,3.35],
    [2.4,1.45,1.42],
    [2.4,3.35,1.42],
    [1.45,3.35,1.42],
]

let result = totalCombinations.reduce(0.0) {$0 + $1.reduce(1.0) {$0 * $1} }

print(result) //->34.91405

但我不确定它是否“优雅”。


不确定在这种情况下是否更优雅,但您可以直接将 * 运算符传递给 reduce$1.reduce(1, combine: *))。 - Hamish
@Hamish,说得好。但是这已经包含在appzYourLife的答案中了。所以,我想我来晚了。 - OOPer

2
也许这就是你在寻找的内容。
let a = [1.0, 2.0, 3.0]
let b = [4.0, 5.0, 6.0]
let c = [7.0, 8.0, 9.0, 10.0]

let d = [a, b, c]

let sum = d.reduce(0.0) { $0 + $1.reduce(1.0) {$0 * $1}}
print(sum) // prints 5166.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接