2016-03-28 63 views
-1

我有范围(Range<String.Index>)如何在swift中对范围的二维数组进行排序?

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

为什么他们在报价? – BallpointBen

+1

你声称有一个'Range '的二维数组,但接受了一个使用二维数组'String'的答案。对于未来的读者,这将有助于澄清你实际上在做什么。 –

+0

@Martin R这是我的错误,首先把字符串,而不是范围(我纠正),奥列格Gordiichuk已经看到这可能是第一次。使用范围,使用$ 0 [0]和$ 1 [0]的比较是正确的想法 - $ 0 [0] .startIndex和$ 1 [0] .startIndex(我测试了它)。 – VYT

回答

2

通货膨胀为了根据在每个阵列 元件中的第一范围的开始索引进行排序,调用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)]] 
+0

好的答案。但用这种方法得到用户期望的结果是不可能的。 –

+0

@OlegGordiichuk你说什么,它不回答这个问题的基础? – ColGraff

+0

@KennethBruno对输入数组运行此排序并查看输出 –

0

对于问题的解决使用在迅速推出功能编程:

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)) } 
+0

根据问题的要求,这种排序结束索引,而不是在开始索引。 –

+0

@MartinR我创建NSRange从范围,并采取最大。你能解释一下我在用什么字符串 –

+0

......并且给出了范围的结束索引。如果用'“7 .. <99”'替换“7 .. <11”',检查结果。 (但我没有对你的答案进行投票:) –

相关问题