需求分析
为所有集合编写一个扩展,该扩展以数组的形式返回N个最小的元素
最小的优先,其中N是整数参数
- [1, 2, 3, 4].smallN(count: 3) 返回 [1, 2, 3].
- ["q", "f", "k"].smallN(count: 10) 返回 [“f”,“k”, “q”].
- [256, 16].smallN(count: 3) 返回 [16, 256].
- String.small(count: 3) 返回 an empty array.
推荐文章
解决方案
在集合中找到单个最小值很容易;在集合中查找两个最小值比较困难,因为如果有合适的较小新值,则需要将最小值移动到较小值
再次找到N个最小的数字更加困难,或者如果您遵循相同的技术,则将更困难。与其保留单个变量的最小值和较小,还不如保留一个由小值组成的排序数组,在新值插入时将它们插入正确的位置。这并不难编写代码,但也不是那么快,而且如果您必须插入大量数字,它将变得非常灾难性地缓慢
要计算整数中特定数字的数量,最简单的方法是将其转换为字符串,然后检查每个字符。 Swift仅允许您在指定正确的约束的情况下执行此操作,应将约束设为Iterator.Element == Int,如下所示
一个既简单又快得多的解决方案是使用内置的sorted()方法,后跟prefix(),该方法返回集合中的前N个项目。如果项目数量少于您的要求,prefix()将返回尽可能多的内容,非常适合此需求。
代码
extension Collection where Iterator.Element: Comparable {
func smallN(count: Int) -> [Iterator.Element] {
let sorted = self.sorted()
return Array(sorted.prefix(count)) }
}
技术交流
QQ:3365059189
SwiftUI技术交流QQ群:518696470
- 请关注我的专栏icloudend, SwiftUI教程与源码
https://www.jianshu.com/c/7b3e3b671970