如何在Swift中删除数组中的每个其他元素?

8

假设我有一个数组:

var stringArray = ["a","b","c","d","e","f","g","h","i","j"]

现在,我该如何删除数组中的“a”、“c”、“e”、“g”和“i”(即所有偶数索引)?

谢谢!

4个回答

17

你可以使用步幅(strides)来完成这个操作,而不是使用C风格的for循环(在即将发布的Swift版本中将被弃用):

var result = [String]()
for i in stride(from: 1, through: stringArray.count - 1, by: 2) {
    result.append(stringArray[i])
}

或者选择更加实用的解决方案,

let result = stride(from: 1, to: stringArray.count - 1, by: 2).map { stringArray[$0] }

类型“Int”没有成员“stride”的值。 - Zaporozhchenko Oleksandr
现在它是一个全局函数。请查看此处的文档:https://developer.apple.com/documentation/swift/1641347-stride。代码应该像这样: let result = stride(from: 1, through: stringArray.count - 1, by: 2).map { stringArray[$0] } - user1687195

10

传统的

var filteredArray = []
for var i = 1; i < stringArray.count; i = i + 2 {
    filteredArray.append(stringArray[i])
}

功能替代品

var result = stringArray.enumerate().filter({ index, _ in
    index % 2 != 0
}).map { $0.1 }

enumerate接受一个元素数组,并返回一个元组数组,每个元组是一个索引-数组对(例如(.0 3, .1 "d"))。然后我们使用模数运算符删除奇数元素。最后,我们使用map将元组数组转换回普通数组。希望对你有所帮助。


3

有多种不同的方法可以实现这一点,但以下是我发现有趣的几种:

indices上使用flatMap()

let result: [String] = stringArray.indices.flatMap {
    if $0 % 2 != 0 { return stringArray[$0] }
    else { return nil }
}
<注意:>需要将result定义为[String],否则编译器无法确定使用哪个版本的flatMap()

或者,如果您想就地修改原始数组:

stringArray.indices.reverse().forEach {
    if $0 % 2 == 0 { stringArray.removeAtIndex($0) }
}

在这种情况下,您需要首先在indices上调用reverse(),以便它们按相反的顺序枚举。否则,在到达数组末尾时,您将尝试删除一个不存在的索引。

注意,如果像这样在整个数组中删除,使用索引删除非常昂贵。 - Alexander

1

Swift 4.2

一个接受泛型并产生简化结果的函数

func stripElements<T>(in array:[T]) -> [T] {
    return array.enumerated().filter { (arg0) -> Bool in
        let (offset, _) = arg0
        return offset % 2 != 0
        }.map { $0.element }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接