获取数组排序的索引

时间:2018-03-07 04:14:45

标签: arrays swift sorting actionscript-3

将一些旧的AS3代码移植到Swift我在代码中遇到了一个障碍......在AS3中,您可以使用数组排序操作返回排序结果的数字索引数组,例如

var indices = columns[0].sort(Array.RETURNINDEXEDARRAY | Array.CASEINSENSITIVE);
  

如果指定值为8或Array.RETURNINDEXEDARRAY   ... args参数的sortOptions参数,Flash返回一个已排序的   反映排序和结果的索引的数字数组   不修改数组。   (AS3 API

Swift 4中有哪些解决方案可以为我提供排序索引?

1 个答案:

答案 0 :(得分:3)

您可以枚举数组,按其元素对其进行排序,并映射元素offset:

let array = [1,3,2,5,4]
let sortedIndices = array.enumerated()
                  .sorted{ $0.element < $1.element }
                  .map{ $0.offset }
sortedIndices   // [0, 2, 1, 4, 3]

如果您愿意,如果您将其元素约束为Comparable协议,您也可以扩展Collection并实现自己的方法:

extension Collection where Element: Comparable {
    func sortedIndices() -> [Int] {
        return enumerated()
            .sorted{ $0.element < $1.element }
            .map{ $0.offset }
    }
}
let array = [1,3,2,5,4]
let sortedIndices = array.sortedIndices()
sortedIndices   // [0, 2, 1, 4, 3]

另一个选择是添加一个闭包作为参数,以允许排序:

extension Collection where Element: Comparable {
    func sortedIndices() -> [Int] {
        return sortedIndices(by: <)
    }
}
extension Collection {
    func sortedIndices(by condition: (Element, Element) -> Bool) -> [Int] {
        return enumerated()
            .sorted{ condition($0.element,$1.element) }
            .map{ $0.offset }
    }
}
let array = [1,3,2,5,4]
let sortedIndices = array.sortedIndices(by: >)
sortedIndices    // [3, 4, 1, 2, 0]