Swift 数组的常见场景解决方案

137 阅读2分钟

在对数据进行逻辑处理时,数组是一个非常常见的用来处理数据的数据结构。对其进行各种操作,实现各种场景的方案是开发者必备的知识之一。

在本篇文章中,我们来看下这些常见的场景如何通过代码来解决。

统计数组中各元素的出现次数

如果你有一个包含各种元素的数组,并且希望计算每个元素出现的频率,则可以通过将 map() 方法与Dictionary 初始化器相结合的方式来实现。示例代码如下:

let items = [1, 2, 3, 3, 2, 0]
let mappedItems = items.map { ($0, 1) }
//[2: 2, 3: 2, 0: 1, 1: 1]
let counts = Dictionary(mappedItems, uniquingKeysWith: +) 

首先,我们声明一个存放元素的数组,接着将其转换为使用元组的键值对数组,其中每个键的值都是数字1。最后,从该元组数组创建一个字典,要求它每次找到重复键时将值累加1。

找到第一个匹配数组元素的索引

如果有一个项目数组,并且希望找到匹配特定条件的第一个项目,则应该使用 firstIndex(where:) 方法。它接受一个代码闭包作为判断条件,将该判断条件应用于数组中的所有元素,然后返回与之匹配的第一个项目的索引。如果没有匹配项,将返回 nil。示例代码如下:

let numbers = [1, 4, 5, 6, 9, 3]
// first = 3
let first = numbers.firstIndex { element in
    return element > 5
}

Tips: 上述代码的闭包可以用简洁模式,但掘金对刀乐符号的支持有文字统计的错误。。。所以这里采用了完整方式。

移除数组中所有符合条件的元素

removeAll(where:) 方法对集合执行一个高性能的就地筛选。你给它一个要运行的闭包条件,它会去掉所有符合你条件的元素。示例代码如下:

var numbers = [1, 4, 5, 6, 9, 3]
numbers.removeAll { element in
    return element < 5
}
print(numbers) // [5, 6, 9]

上述代码声明了一个存放整数的数组,假设我们需要移除数组中所有小于 5 的元素,那么我们就可以调用 removeAll(where:),在闭包中添加 element < 5 的判断条件。最后我们可以看到经过移除之后, numbers 中只剩下大于 5 的元素了。

数组中所有元素是否都符合某个条件

如果你有一个数组,并且希望检查数组中的每个元素是否都符合特定条件,那么你可以使用 allSatisfy()方法。示例代码如下:

let numbers = [1, 4, 5, 6, 9, 3]
let result = numbers.allSatisfy { element in
    return element < 10
}
print(result) // true

比如,我们向检查是否 numbers 中的每个元素都小于 10,我们就可以通过上述代码来进行检查。