我试图删除多个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
,当num
为2
时应该消除[4,8,10,12,...]
等等,但事实并非如此。
答案 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 })
}