使用高阶函数排序:优先考虑一个元素
Sorting with higher order functions: Giving precedence to one element
像这样的无序整数数组:
let numbers = [4, 3, 1, 5, 2]
在 Swift 中,是否可以使用 .sorted { } 对数组进行排序,其中一个项目具有优先级并放置在数组的第一个索引中。所以我们可以得到 [3, 1, 2, 4, 5]?
而不是返回 [1, 2, 3, 4, 5]
您可以这样声明一个函数:
func sort(_ array: [Int], prioritizing n: Int) -> [Int] {
var copy = array
let pivot = copy.partition { [=10=] != n }
copy[pivot...].sort()
return copy
}
其中使用了partition(by:)
函数。
你可以这样使用它:
let numbers = [4, 3, 1, 5, 2]
let specialNumber = 3
sort(numbers, prioritizing: specialNumber) //[3, 1, 2, 4, 5]
以下是一些测试用例:
sort([3, 3, 3], prioritizing: 3) //[3, 3, 3]
sort([9, 4, 1, 5, 2], prioritizing: 3) //[1, 2, 4, 5, 9]
这是一个仅使用 sorted(by:)
的替代解决方案:
let numbers = [4, 3, 1, 5, 2]
let vipNumber = 3
let result = numbers.sorted {
([=13=] == vipNumber ? Int.min : [=13=]) < ( == vipNumber ? Int.min : )
}
print(result) //[3, 1, 2, 4, 5]
像这样的无序整数数组:
let numbers = [4, 3, 1, 5, 2]
在 Swift 中,是否可以使用 .sorted { } 对数组进行排序,其中一个项目具有优先级并放置在数组的第一个索引中。所以我们可以得到 [3, 1, 2, 4, 5]?
而不是返回 [1, 2, 3, 4, 5]您可以这样声明一个函数:
func sort(_ array: [Int], prioritizing n: Int) -> [Int] {
var copy = array
let pivot = copy.partition { [=10=] != n }
copy[pivot...].sort()
return copy
}
其中使用了partition(by:)
函数。
你可以这样使用它:
let numbers = [4, 3, 1, 5, 2]
let specialNumber = 3
sort(numbers, prioritizing: specialNumber) //[3, 1, 2, 4, 5]
以下是一些测试用例:
sort([3, 3, 3], prioritizing: 3) //[3, 3, 3]
sort([9, 4, 1, 5, 2], prioritizing: 3) //[1, 2, 4, 5, 9]
这是一个仅使用 sorted(by:)
的替代解决方案:
let numbers = [4, 3, 1, 5, 2]
let vipNumber = 3
let result = numbers.sorted {
([=13=] == vipNumber ? Int.min : [=13=]) < ( == vipNumber ? Int.min : )
}
print(result) //[3, 1, 2, 4, 5]