2016-03-28 4 views
-1

I haben zweidimensionale Anordnung von Bereichen (Range<String.Index>)Wie zweidimensionales Array von Bereichen in swift sortieren?

var arrayToSort = [ 
        [14..<20, 10..<29, 13..<21], 
        [7..<11, 1..<5, 4..<8], 
        [30..<50, 40..<54, 32..<60] 
        ] 

und ich brauche es in aufsteigender Reihenfolge der start.Index der ersten Bereiche von jedem Elemente der zweidimensionalen Anordnung zu sortieren, wie dies das Array zu haben,

var sortedArray = [ 
        [7..<11, 1..<5, 4..<8], 
        [14..<20, 10..<29, 13..<21], 
        [30..<50, 40..<54, 32..<60] 
        ] 
+0

Warum sind sie in Anführungszeichen? – BallpointBen

+1

Sie beanspruchen, ein 2-d Array von 'Range ' zu haben, akzeptierten aber eine Antwort, die mit einem 2-d Array von 'String' arbeitet. Für zukünftige Leser wäre es hilfreich zu klären, was Sie tatsächlich tun. –

+0

@Martin R Es war mein Fehler, zuerst die Saiten anstelle von Bereichen (ich korrigierte), Oleg Gordiichuk haben dies zuerst wahrscheinlich gesehen. Mit Bereichen ist es die gleiche richtige Idee, $ 0 [0] und $ 1 [0] zu verwenden, wie er vorgeschlagen hat - $ 0 [0] .startIndex und $ 1 [0] .startIndex (ich habe es getestet). – VYT

Antwort

2

in jedem Array Element nach dem Start-Index des ersten Bereichs zu sortieren, rufen sort() mit einem Verschluss, der den Startindex des ersten Bereichs seiner beiden Parameter vergleicht:

let sortedArray = arrayToSort.sort { 
    $0.first?.startIndex < $1.first?.startIndex 
} 

Die optionale Verkettung mit ? sorgt dafür, dass ein verschachteltes Array leer ist. In diesem Fall wird $n.first?.startIndex zu nil ausgewertet (und das entsprechende Element wird vor allen anderen sortiert).

Voll umluftunabhängigem Beispiel:

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

Schöne Antwort. Aber es ist unmöglich, Ergebnisse zu erzielen, die der Benutzer von diesem Ansatz erwartet. –

+0

@OlegGordiichuk Was ist Ihre Grundlage für die Aussage, dass es die Frage nicht beantwortet? – ColGraff

+0

@KennethBruno führen Sie diese Sortierung für das Eingangsarray und sehen Ausgabe –

0

zur Lösung des Problems funktionale Programmierung verwenden, die in schnellen eingeführt:

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]))) } 

mit loc Fixing ation des NSRange

let sortedArray = arrayToSort.sort { ((NSRangeFromString($0[0]).location)) < ((NSRangeFromString($1[0]).location)) } 
+0

Sortiert nach dem End-Index und nicht nach dem Startindex wie in der Frage angegeben. –

+0

@MartinR ich NSRange aus Range erstellen und dann max. Könntest du mir bitte erklären, wo ich mit der Zeichenkette –

+0

woking bin ... und das gibt den Endindex des Bereichs. Überprüfen Sie das Ergebnis, wenn Sie '" 7 .. <11 "' durch '" 7 .. <99 "' ersetzen. (Aber ich habe nicht über deine Antwort abgestimmt :) –