在Swift中遍历一个UInt8整数数组;对数组的子集执行计算

时间:2014-10-06 20:35:56

标签: arrays swift reduce

我有一组无符号整数,我想获得某些子集的乘积。

例如,如果我的数组是[2,2,1,5],我想要每两个数字的乘积(2 * 2 = 4和1 * 5 = 5)。

到目前为止,我已经:

var myArray:[UInt8] = [2,2,1,5]
var mySlice: Array<UInt8>

for (index,i) in enumerate(myArray) {
    if (index % 2 == 1) {
        mySlice = Array(myArray[(index - 1)...index])
        println(mySlice.reduce(1,*))
        mySlice.removeAll()
    }
}

这看起来好像会起作用(虽然很难看)但是我觉得执行被打断了,原因是:EXC_BAD_INSTRUCTION。

以一定间隔线性向下返回返回产品(或计算)的数组的最佳方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

看起来问题是在迭代更大的数组时清除切片。

您可以通过将项目添加到单独的数组中来解决此问题,如下所示:

let myArray:[UInt8] = [2,2,1,5]
var result:[UInt8] = []

for (index,i) in enumerate(myArray) {
    if (index % 2 == 1) {
        let mySlice = Array(myArray[(index - 1)...index])
        let tmp = mySlice.reduce(1,*)
        result.append(tmp)
        println(tmp)
    }
}
println(result)

如果您想将结果放回myArray,可以在循环后分配。

Demo.

答案 1 :(得分:0)

您可以进行一些更改,这将使您比当前尝试更容易(并且具有更好的性能)。首先,使用全局stride(from:to:interval:)函数,它构建一个索引序列,就像你想要的那样 - 不需要遍历所有索引并跳过奇怪的索引!

for i in stride(from: 0, to: myArray.count, by: 2) {
    // ...
}

其次,您可以使用切片的reduce方法,因此您不必将切片转换回数​​组(这样做是unnecessary and inefficient):

let r = myArray[i ... i + 1].reduce(1, *)

所以要把它们放在一起,你的代码可能是:

var myArray: [UInt8] = [2, 2, 1, 5]
var result: [UInt8] = []

for i in stride(from: 0, to: myArray.count, by: 2) {
    result.append( myArray[i...i + 1].reduce(1, *) )
}
// result is [4, 5]
相关问题