我有范围(Range<String.Index>)
var arrayToSort = [
[14..<20, 10..<29, 13..<21],
[7..<11, 1..<5, 4..<8],
[30..<50, 40..<54, 32..<60]
]
我需要按照start.Index的顺序对二维数组的每个元素进行排序,以得到这样的数组
var sortedArray = [
[7..<11, 1..<5, 4..<8],
[14..<20, 10..<29, 13..<21],
[30..<50, 40..<54, 32..<60]
]
答案 0 :(得分:2)
根据每个数组中第一个范围的起始索引进行排序
element,使用一个比较起始索引的闭包来调用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)]]
答案 1 :(得分:0)
为了解决这个问题,请使用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)) }