首页 > 趣闻 > 正文内容

Swift数组排序:升序降序的3种实现技巧

趣闻2025-05-19 13:05:50

你是不是每次看到数组排序就头疼?明明想按分数从高到低排个名次,结果代码一跑出来顺序全乱了?别慌!今天咱们就掰开了揉碎了聊这个事儿,保证看完你也能成为数组排序小能手!


一、最基础的排序方法: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
}

这里有个血泪教训:??闭包里的00和01代表相邻两个元素??,比较的时候要明确指定比较哪个属性。我之前就忘了写.score,结果编译器报错一脸懵逼,愣是查了半小时文档...


三、黑科技:元组比较法

这个方法估计很多老司机都不知道!??当需要多条件排序时,用元组比较简直爽到飞起??!比如说既要按分数排序,分数相同的再按姓名排:

swift复制
let complexSort = students.sorted {
    ($0.score, $1.name) > ($1.score, $0.name)
}

这个写法是不是很魔性???Swift会自动按元组元素的顺序逐个比较??,先比第一个元素,相同的话再比第二个。不过要注意:所有元素都要遵循Comparable协议,像String、Int这些基础类型都支持,自定义类型就得自己实现比较逻辑了。


个人心得时间

说实话,我刚学Swift那会儿总觉得排序方法太多记不住。后来发现其实就三点秘诀:

  1. ??能用系统方法就别自己造轮子??(Swift的排序算法比你自己写的快得多)
  2. ??闭包刚开始看着吓人,用多了真香??
  3. ??多条件排序用元组比较,代码量直接砍半??

举个真实案例:上次做电商项目要按价格+销量+好评率三级排序,用元组比较法5行代码搞定,隔壁安卓组小哥看了直呼内行!


常见坑点预警

最后给大家提个醒,这几个坑我敢说80%的新人都踩过:

  1. ??忘了sorted()和sort()的区别??(一个创建新数组,一个修改原数组)
  2. ??自定义类型没实现Comparable协议??(编译器不报错但运行崩溃)
  3. ??降序排列写成<符号??(这个错误太经典了,建议纹在手上)
  4. ??多条件排序顺序写反??(先比较的条件要放在元组最前面)

话说回来,这些坑踩过一遍之后,你就会发现数组排序也就那么回事儿。下次再遇到排序需求,完全可以嘴角上扬45度,淡定地甩出一句:"就这?"


最后的最后

其实吧,编程就像炒菜,火候到了自然就会了。今天说的这三种方法,建议各位先在Playground里自己敲一遍。保准你练完再看项目里的排序代码,就跟看小学算术题似的——简单得想笑!

搜索