排序叠箱子 闭包应用

40 阅读1分钟

有这么一个数组,每个元素都是由元组构成的,其中每个元组有两个值,第一个值是宽,第二个值是高

let boxes: Array = [(2, 1), (1, 1), (4, 1), (6, 1), (4, 3)]

现在需要排序,以0从大到小排序,若0从大到小排序,若0相等,以$1从大到小排序

怎么实现呢?

如果这个数组不是元组的话,我们可以直接使用.sorted排序

但是这是数组的元素是由元组构成的,所以,我们应该使用函数或者闭包分情况讨论,把可能出现的两种情况都写出来,就可以了。

那么,存在那两种情况呢?

1、先按照宽度从大到小排。

2、若宽度相等,则按照高度从大到小拍。

那么,我们就可以设置一个闭包函数了(因为函数写的字比较多,所用闭包)

先声明一个常量let sortedBoxes

然后使用sorted方法

let sortedBoxes = boxes.sorted{ lhs, rhs in

if lhs.0 > rhs.0 {

return true

} else if {

lhs.0 == rhs.0 && lhs.1 > rhs.1 

return true

} else {

return false

}

这个闭包的意思就是前面说的两种情况。

只有这两种情况是true,其他都是false。

运行之后就可以排序了。

如果写函数的话,会多写几行,其实完全可以省略

func 排序(_, boxes: Array) -> Array {

return boxes.sorted { lhs, rhs in 

if lhs.0 > rhs.0 {

return true

} else if ......

后面就都一样了。

需要注意的是return后面是用参数代替了Array