使用布尔数组选择要转换的特定索引

时间:2018-12-22 17:11:07

标签: arrays swift functional-programming boolean

我正在尝试使用布尔数组作为转换另一个相同大小的Ints数组中的特定索引的机制,而忽略了对应选择数组中包含false的索引。

基本上,我希望此函数仅转换在对应的布尔选择数组中包含“ true”的值,而将其他值保留为原来的值。

这是我设法使用for循环使其工作的一种方式。

但是,我想知道如何以更实用的方式进行此操作。我也很容易被告知这绝对是愚蠢的,我应该尝试另一种方式。使用zip函数在每次递归中创建元组都取得了一些成功,但是我想看看专家是如何做到的。

我想看看是否有可能使用地图代替像这里一样的for循环。

func changeSelectedChannels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [UInt8] {
    var j = 0
    var newArray = oldArray
    for index in selections{
        if index == true{
            newArray[j] = newVal
            j += 1
        }else{
            j += 1
        }
    } 
    return newArray   
}

1 个答案:

答案 0 :(得分:1)

使用zip()map()可以达到相同的结果:

func changeSelectedChannels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [UInt8] {
    let newArray = zip(oldArray, selections).map {
        (oldVal, flag) in flag ? newVal : oldVal
    }
    return newArray
}

闭包被所有对调用(oldArray中的一个元素和selections中的相应元素),并返回旧数组值或newVal

另一种可能的解决方案是使用enumerated()摆脱j索引变量:

func changeSelectedChannels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [UInt8] {
    var newArray = oldArray
    for (idx, flag) in selections.enumerated() where flag {
        newArray[idx] = newVal
    }
    return newArray
}