我正在创建一个过滤数组的函数,例如
x = [10,20,30,40,50]
过滤器(x,10,20)
输出应为30,40,50
我得到一个索引越界错误。
这是我的代码:
func filterArray( _ x: [Int], _ nums: Int...) -> [Int]{
var arrayX = x
for i in 0...arrayX.count-1{
for j in 0...nums.count-1 {
if arrayX[i] == nums[j]{//Changed arrayX to x because x was never changed
if let index = arrayX.index(of: nums[j]) {
arrayX.remove(at: index) //error is here
}
else{
}
}
}
}
return arrayX
}
var mArray = [10,20,30,40,50]
filterArray(mArray,10)
答案 0 :(得分:3)
你这样做的方式不正确,你在循环中改变一个数组。从数组中删除对象时,数组计数会更改,但循环仍使用先前计算的array.count值运行。
执行此操作的方法要简单得多,您只需要将filter
和contains
函数组合在一起即可实现此目的:
func filterArray( _ x: [Int], _ nums: Int...) -> [Int]
{
let filteredArray = x.filter({ !nums.contains($0)})
return filteredArray
}
答案 1 :(得分:0)
一旦你从数组中删除了一个元素,它的大小发生了变化,但是你的循环仍在继续,直到导致问题的前一个计数尝试使用不同的数组来完成循环并存储结果而你不需要找到它已经存在的指数,' i'是元素的索引。
答案 2 :(得分:0)
如果您使用Set
,您的功能会更快。
func filter(list: [Int], _ remove: Int...) -> [Int] {
let removeSet = Set(remove)
return list.filter { removeSet.contains($0) }
}