2016-03-28 62 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」',檢查結果。 (但我沒有對你的答案進行投票:) –

相關問題