Swift 4多维数组排序求助:新手需实现指定顺序的数组排序
解决Swift多维数组的多级排序问题
嘿,作为Swift新手能尝试自己写排序逻辑已经很棒啦!你遇到的问题其实很常见:只用arr.sort { $0[0] < $1[0] }排序时,只会对比子数组的首列元素,当首列相等时,不会继续往后比较其他列,所以首列相同的子数组顺序还是原始状态,和你想要的结果不符。
从你给出的预期结果来看,你需要的是从左到右依次对比子数组的每一列:先比首列,首列小的排前面;首列相等就比第二列,第二列小的排前面;以此类推,直到找到第一个不同的元素来决定顺序。
针对这个需求,给你两种简洁的实现方式:
方式一:手动依次对比每一列
适合子数组长度不固定,或者需要自定义某一列比较规则的场景:
var arr = [[10, 2, 4, 10, 23, 56], [0, 12, 14, 20, 28, 42], [0, 2, 4, 10, 26, 54], [1, 24, 34, 40, 47, 51], [1, 23, 24, 30, 33, 50]] arr.sort { // 先比首列 if $0[0] != $1[0] { return $0[0] < $1[0] } // 首列相等,比第二列 if $0[1] != $1[1] { return $0[1] < $1[1] } // 第二列相等,比第三列,以此类推 if $0[2] != $1[2] { return $0[2] < $1[2] } if $0[3] != $1[3] { return $0[3] < $1[3] } if $0[4] != $1[4] { return $0[4] < $1[4] } // 前面都相等,比最后一列 return $0[5] < $1[5] } print(arr) // 输出结果正好是你期望的:[[0, 2, 4, 10, 26, 54], [0, 12, 14, 20, 28, 42], [1, 23, 24, 30, 33, 50], [1, 24, 34, 40, 47, 51], [10, 2, 4, 10, 23, 56]]
方式二:利用Swift元组的自动比较特性
因为你的每个子数组都是固定的6个Int元素,Swift的元组会自动按元素顺序依次对比,用这个特性可以让代码更简洁:
var arr = [[10, 2, 4, 10, 23, 56], [0, 12, 14, 20, 28, 42], [0, 2, 4, 10, 26, 54], [1, 24, 34, 40, 47, 51], [1, 23, 24, 30, 33, 50]] // 把数组转成元组后直接对比 arr.sort { let tuple0 = ($0[0], $0[1], $0[2], $0[3], $0[4], $0[5]) let tuple1 = ($1[0], $1[1], $1[2], $1[3], $1[4], $1[5]) return tuple0 < tuple1 } print(arr) // 同样会输出你想要的排序结果
小提醒
如果你的数组里存在长度不一致的子数组,建议先做个校验(比如检查所有子数组的count是否为6),避免出现数组越界的错误哦~
内容的提问来源于stack exchange,提问作者graham4d
相关产品推荐
相关产品推荐

