【问题标题】:Sorting with higher order functions: Giving precedence to one element使用高阶函数排序:优先考虑一个元素
【发布时间】:2019-07-15 12:25:40
【问题描述】:

使用无序的 Ints 数组:

let numbers = [4, 3, 1, 5, 2]

是否可以在 Swift 中使用 .sorted { } 对数组进行排序,其中一项优先排序并放置在数组的第一个索引中。所以不是返回 [1, 2, 3, 4, 5] 我们可以得到 [3, 1, 2, 4, 5]?

【问题讨论】:

    标签: swift sorting higher-order-functions


    【解决方案1】:

    你可以这样声明一个函数:

    func sort(_ array: [Int], prioritizing n: Int) -> [Int] {
        var copy = array
        let pivot = copy.partition { $0 != 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 {
        ($0 == vipNumber ? Int.min : $0) < ($1 == vipNumber ? Int.min : $1)
    }
    print(result)                              //[3, 1, 2, 4, 5]
    

    【讨论】:

    • 使用数组扩展可能会更好
    • 谢谢,这有帮助。 partition(by:) 不是我遇到过的……会看看
    • @Zaphod 我觉得它只会污染一个不常见的用例的数组命名空间。 priority queue(具有多个优先级)将是更合适的数据结构,并且是解决此问题的更通用的解决方案。
    • 这个想法是更通用的,因为这种行为可能对Int以外的其他类型有用。但这只是一个提议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2010-10-27
    相关资源
    最近更新 更多