【问题标题】:Using an array of Booleans to select specific indices for transformation使用布尔数组选择特定索引进行转换
【发布时间】:2019-05-22 16:33:41
【问题描述】:

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

基本上,我希望这个函数只转换相应布尔选择数组中包含“真”的值,而让其他值保持原样。

以下是我设法(在某种程度上)使用 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   
}

【问题讨论】:

    标签: arrays swift functional-programming boolean


    【解决方案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
    }
    

    【讨论】:

    • 谢谢!我会试一试并报告。
    • 我试过了,效果很好。几分钟后,我将提出一个更复杂的问题,将这个功能变成一个结构和类。我很想从你那里得到更多帮助。衷心感谢!
    猜你喜欢
    • 2020-08-27
    • 2018-07-06
    • 2020-02-14
    • 2016-09-08
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多