代码之家  ›  专栏  ›  技术社区  ›  BadmintonCat

获取数组排序的索引

  •  1
  • BadmintonCat  · 技术社区  · 6 年前

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

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

    如果指定值8或数组。用于的RETURNINDEXEDARRAY 的sortOptions参数。。。args参数,Flash返回已排序的 反映排序结果的索引的数字数组,以及 不修改数组。 ( AS3 API )

    Swift 4中有没有提供排序索引的解决方案?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Leo Dabus    6 年前

    可以枚举数组,按元素对其排序,并映射元素偏移:

    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]
    

    如果愿意,还可以扩展集合并实现自己的方法,前提是将其元素约束到可比较的协议:

    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]