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

时间:2016-03-28 10:03:57

标签: arrays swift range

我有范围(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]
                  ]

2 个答案:

答案 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)) }