【问题标题】:Replacing the position of an element in Array of Array替换Array of Array中元素的位置
【发布时间】:2015-11-24 17:42:21
【问题描述】:

我一直在尝试运行此循环来更改基于数组的元素的位置,但出现以下错误。不太确定可能出了什么问题。任何想法或想法!谢谢。

var population = [[98, 8, 45, 34, 56], [9, 13, 65, 4, 90], [24, 5, 4, 56, 88], [3, 55, 22, 19, 10]]

private func randomIntergerInRange(low:Int, high:Int) -> Int {
    let randomGeneratedNumber = low + Int(arc4random()) % (high - low);
    return Int(randomGeneratedNumber)
}

for individual in population {
    var mutate = 0.01

    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {

        var positionToMutate = randomIntergerInRange(0, (individual.count - 1))

        var valueToAssign = randomIntergerInRange(minElement(individual), maxElement(individual))

        individual[positionToMutate] = valueToAssign
        print(individual)

    }
}

【问题讨论】:

  • 为什么你的数组看起来更像字典
  • 这是一个数组数组@Lamar ;)

标签: arrays swift for-loop


【解决方案1】:

数组是按值传递的,所以当你在每次迭代中使用individual 时,它会被分配一个population 子数组的副本,即使你使用for var individual in population ...,你也只会改变原始数组的副本。

如果你想改变原始数组的值,你可以使用索引来实现,例如:

for index in population.indices {
    var mutate = 0.01

    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {

        var positionToMutate = randomIntergerInRange(0, (population[index].count - 1))

        var valueToAssign = randomIntergerInRange(minElement(population[index]), maxElement(population[index]))

        population[index][positionToMutate] = valueToAssign
        print(population[index])

    }
}

【讨论】:

  • 哦,我明白了。我没有意识到这一点。非常感谢。 ;) @Renzo
【解决方案2】:

错误消息的原因:循环中的 individual 对象是不可变的,它是对象的副本,而不是引用。

你可以这样做,使用enumerate:

for (index, individual) in enumerate(population) {
    var mutate = 0.01

    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {

        var positionToMutate = randomIntergerInRange(0, (individual.count - 1))

        var valueToAssign = randomIntergerInRange(minElement(individual), maxElement(individual))

        population[index][positionToMutate] = valueToAssign

        print(population[index])

    }
}

您不应该在迭代集合时修改它,顺便说一句,它可能会产生副作用。

Swift 2 更新

private func randomIntegerInRange(low:Int, _ high:Int) -> Int {
    let randomGeneratedNumber = low + Int(arc4random()) % (high - low)
    return Int(randomGeneratedNumber)
}

var mutate = 0.01
for (index, individual) in population.enumerate() {
    if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {
        var positionToMutate = randomIntegerInRange(0, (individual.count - 1))
        if let min = individual.minElement(), max = individual.maxElement() {
            var valueToAssign = randomIntegerInRange(min, max)
            population[index][positionToMutate] = valueToAssign
            print(population[index])
        }
    }
}

【讨论】:

  • 谢谢。 ;)。我不太确定的东西!。
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多