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

ars1skjm  于 2022-11-21  发布在  Swift
关注(0)|答案(2)|浏览(231)

我有一个二维数组(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]
                  ]
1szpjjfi

1szpjjfi1#

若要根据每个数组元素中第一个范围的起始索引进行排序,请使用闭包调用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
})
hsgswve4

hsgswve42#

为解决该问题,请使用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)) }

相关问题