从数字范围中找到给定数的倍数 - 斯威夫特

时间:2018-02-20 19:38:19

标签: arrays swift

我试图删除多个2的数组元素,但是我收到错误:

  

Fatal error: Index out of range

// remove all multiples from numbers array [2,3,4,5,6,7,......] except the current number which is 2
// num = 2
for i in 0...numbers.count {
    if(i == num) {
        continue
    }
    if(num % numbers[i] == 0) {
        numbers.remove(at: i)
    }
}

数组numbers包含998个元素,num等于2,然后在下一个3上迭代到for loop。理论上,for loop,当num2时应该消除[4,8,10,12,...]等等,但事实并非如此。

1 个答案:

答案 0 :(得分:3)

您当前代码的直接问题是由于0索引,numbers.count大于numbers的最后一个索引。您应该使用for i in 0..<numbers.count或更确切地说使用for i in numbers.indices。此外,if语句中的两个条件也是错误的,它们应该是if numbers[i] == num { continue}if numbers[i] % num == 0。但是,您仍然会在循环内修改数组的长度,但保持循环范围不变。

更好的解决方案是简单地使用filter来实现目标。只需检查当前元素是否是要使用%运算符删除的数字的倍数,然后检查数字是否不是您要搜索的数字,只有在满足两个条件时才删除它。

let oneToThousand = [Int](2...1000)
func removeMultiplesOf(num:Int, from array:[Int])->[Int]{
    return array.filter({ currentNum->Bool in
        //Only discard the number if it's a multiple of num, but it is not num
        if currentNum%num == 0 && currentNum != num {
            return false
        } else {
            return true
        }
    })
}
let withoutMultiplesOfTwo = removeMultiplesOf(num: 2, from: oneToThousand)

输出:

  

[2,3,5,7,9,11,13,...]

如果您更喜欢简洁的代码而不是可读性,则可以将该函数简单地编写为

func removeMultiplesOf(num:Int, from array:[Int])->[Int]{
    return array.filter({ currentNum in return currentNum%num != 0 || currentNum == num })
}