如何在swift中对二维数组进行排序



我有二维范围数组(Range<String.Index>)

var arrayToSort = [
                   [14..<20, 10..<29, 13..<21],
                   [7..<11, 1..<5, 4..<8], 
                   [30..<50, 40..<54, 32..<60]
                  ]

我需要按开始的升序排序。第一个索引的范围从二维数组的每个元素开始,以具有类似的数组

 var sortedArray = [
                   [7..<11, 1..<5, 4..<8],
                   [14..<20, 10..<29, 13..<21],
                   [30..<50, 40..<54, 32..<60]
                  ]

根据每个数组中第一个范围的起始索引进行排序元素,使用比较起始索引的闭包调用sort()其两个参数的第一个范围:

let sortedArray = arrayToSort.sort {
    $0.first?.startIndex < $1.first?.startIndex
}

使用?的可选链接处理嵌套数组为空。在这种情况下,$n.first?.startIndex计算为nil(并且相应的元素在所有其他元素之前排序)。

完整的自包含示例:

let s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
let arrayToSort = [
    [ s.rangeOfString("EFG")!, s.rangeOfString("MNO")!],
    [ s.rangeOfString("DEFGH")!, s.rangeOfString("XYZ")!],
    [ ]
]
print(arrayToSort)
// [[Range(4..<7), Range(12..<15)], [Range(3..<8), Range(23..<26)], []]
let sortedArray = arrayToSort.sort {
    $0.first?.startIndex < $1.first?.startIndex
}
print(sortedArray)
// [[], [Range(3..<8), Range(23..<26)], [Range(4..<7), Range(12..<15)]]

Swift 4及更高版本的更新:

let s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
let arrayToSort = [
    [ s.range(of: "EFG")!, s.range(of: "MNO")!],
    [ s.range(of: "DEFGH")!, s.range(of: "XYZ")!],
    [ ]
]
let sortedArray = arrayToSort.sorted(by: {
    $0.first?.lowerBound ?? s.startIndex < $1.first?.lowerBound ?? s.startIndex
})

为了解决问题,请使用swift:中引入的功能编程

   var arrayToSort = [
        ["14..<20", "10..<29", "13..<21"],
        ["7..<11", "1..<5", "4..<8"],
        ["30..<50", "40..<54", "32..<60"]
    ]
let sortedArray = arrayToSort.sort { (NSMaxRange(NSRangeFromString($0[0]))) < (NSMaxRange(NSRangeFromString($1[0]))) }

使用NSRange 的位置进行修复

let sortedArray = arrayToSort.sort { ((NSRangeFromString($0[0]).location)) < ((NSRangeFromString($1[0]).location)) }

最新更新