Swift数组排序:升序降序的3种实现技巧
你是不是每次看到数组排序就头疼?明明想按分数从高到低排个名次,结果代码一跑出来顺序全乱了?别慌!今天咱们就掰开了揉碎了聊这个事儿,保证看完你也能成为数组排序小能手!
一、最基础的排序方法:sorted()与sort()
先来点简单的,??Swift自带的排序方法简直就是新手福利??!咱们先看这段代码:
swift复制let scores = [78, 92, 65, 88, 100] // 升序排列 let sortedScores = scores.sorted() // 降序排列 let reversedScores = scores.sorted(by: >)
这里藏着一个重要知识点:??sorted()不会修改原数组??,而是生成新数组。你要是想直接改原数组,换成sort()
方法就行:
swift复制var mutableScores = [78, 92, 65, 88, 100] mutableScores.sort(by: <) // 升序排列
注意看这个by:
参数,??大于号(>)就是降序,小于号(<)就是升序??,这个符号方向可千万别记反了!我之前就犯过这个傻,把排行榜排成倒数的,差点被产品经理追杀...
二、进阶玩法:闭包自定义排序
说到这儿你可能会问:要是数组里不是数字咋整?比如说要按名字首字母排序???闭包排序就是你的救星??!来看这个学生名单的例子:
swift复制struct Student { let name: String let score: Int } let students = [ Student(name: "张三", score: 88), Student(name: "李四", score: 92), Student(name: "王五", score: 75) ] // 按分数降序排列 let ranked = students.sorted { $0.score > $1.score // 这里有个坑!新手常写成$0 > $1 } // 按姓名升序排列 let nameSorted = students.sorted { $0.name < $1.name }
这里有个血泪教训:??闭包里的0和1代表相邻两个元素??,比较的时候要明确指定比较哪个属性。我之前就忘了写.score,结果编译器报错一脸懵逼,愣是查了半小时文档...
三、黑科技:元组比较法
这个方法估计很多老司机都不知道!??当需要多条件排序时,用元组比较简直爽到飞起??!比如说既要按分数排序,分数相同的再按姓名排:
swift复制let complexSort = students.sorted { ($0.score, $1.name) > ($1.score, $0.name) }
这个写法是不是很魔性???Swift会自动按元组元素的顺序逐个比较??,先比第一个元素,相同的话再比第二个。不过要注意:所有元素都要遵循Comparable协议,像String、Int这些基础类型都支持,自定义类型就得自己实现比较逻辑了。
个人心得时间
说实话,我刚学Swift那会儿总觉得排序方法太多记不住。后来发现其实就三点秘诀:
- ??能用系统方法就别自己造轮子??(Swift的排序算法比你自己写的快得多)
- ??闭包刚开始看着吓人,用多了真香??
- ??多条件排序用元组比较,代码量直接砍半??
举个真实案例:上次做电商项目要按价格+销量+好评率三级排序,用元组比较法5行代码搞定,隔壁安卓组小哥看了直呼内行!
常见坑点预警
最后给大家提个醒,这几个坑我敢说80%的新人都踩过:
- ??忘了sorted()和sort()的区别??(一个创建新数组,一个修改原数组)
- ??自定义类型没实现Comparable协议??(编译器不报错但运行崩溃)
- ??降序排列写成<符号??(这个错误太经典了,建议纹在手上)
- ??多条件排序顺序写反??(先比较的条件要放在元组最前面)
话说回来,这些坑踩过一遍之后,你就会发现数组排序也就那么回事儿。下次再遇到排序需求,完全可以嘴角上扬45度,淡定地甩出一句:"就这?"
最后的最后
其实吧,编程就像炒菜,火候到了自然就会了。今天说的这三种方法,建议各位先在Playground里自己敲一遍。保准你练完再看项目里的排序代码,就跟看小学算术题似的——简单得想笑!