【问题标题】:Map/reduce with index in Swift 4在 Swift 4 中使用索引映射/减少
【发布时间】:2018-08-14 21:56:49
【问题描述】:

如何在 Swift 4 中以更优雅的方式完成类似以下的事情,例如使用 map 和/或 reduce。

为了在此处发布,我已经简化了代码,但请注意它确实需要使用索引。

var numbers = [50, 20, 70, 80, 90]
var result = [0,0,0]
for number in numbers {
  for i in 0...2 {
    result[i] += number + i
  } 
}

最终结果应该是:

[Int] = 3 values {
  [0] = 310
  [1] = 315
  [2] = 320
}

【问题讨论】:

  • 您实际上想要做什么?举一个例子在大多数情况下是有帮助的,但只举一个例子可以证明是反作用的。特别是当您要求针对特定问题寻求更好的解决方案时,因为在这种情况下,您最终可能会得到对实际问题的次优解决方案以及适合特定示例的最佳/优雅解决方案。顺便说一句,您的代码中没有 Dictionary,因此您要么无缘无故地使用了该标签,要么您的代码没有产生预期的结果。
  • let sum = numbers.reduce(0, +); let result = (0...2).map({ $0 + sum }) 但就像大卫所说的那样,这可能并不能解决你真正的问题。
  • 旁注,numbers 似乎没有任何理由成为变量。
  • 乔希,这不对。这会产生[310, 311, 312],这不是 OP 想要的。
  • 这是什么意思?您将数字元素的总和放入结果中,加上 index*numbers.count。为什么?

标签: swift dictionary reduce


【解决方案1】:

这是等价的

let result = (0...2).map({ index in numbers.reduce(0) { (sum, current) in sum + current + index } })

或者如果你想使用result数组

let r = result.enumerated().map({ (index, _) in numbers.reduce(0) { (sum, current) in sum + current + index } })

但更高效的方法是这样的

let sum = numbers.reduce(0, +)
let resultsExpected = 3
let result = (0..<resultsExpected).map({ $0 * numbers.count + sum })

【讨论】:

  • 可能最好将numbers 的总和提升到循环之外。
  • 您的第二个选项更清晰更有效。当我意识到您已经提供了它时,我正要发布您的第二个解决方案。 (已投票)
  • 同意@DuncanC,我也更喜欢第二个选项。谢谢大家!
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2016-01-22
  • 1970-01-01
  • 2012-06-04
相关资源
最近更新 更多