我有二维范围数组(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)) }