2017-07-23 3 views
0

Ich möchte mein String-Array basierend auf dem letzten Zeichen sortieren. Hier ist meine String-Array:String-Sortierung basierend auf dem letzten Zeichen in Swift

["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2", 
"b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"] 

Jetzt möchte ich dieses Array sortieren, basierend auf den letzten Wert, der nachletzten Strich ist (_). Ist es möglich?

Dank

+2

Wird dem letzten Unterstrich immer eine einzelne Ziffer folgen? Oder kann es mehrere Ziffern oder andere Zeichen sein? Wenn ja: Wie sollen sie sortiert werden, numerisch oder als String? Was ist, wenn die Suffices gleich sind? - Eine präzise Problemstellung, die alle möglichen Fälle abdeckt, ist immer ein guter Anfang. –

Antwort

2

sorted kann eine benutzerdefinierte Sortierbedingung zum Beispiel liefern (unter der Annahme, dass alle Saiten nicht leer sind)

let array = ["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2", "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"] 
let sortedArray = array.sorted { $0.substring(from: $0.index(before: $0.endIndex)) < $1.substring(from: $1.index(before: $1.endIndex)) } 
+0

Darf ich erwähnen, dass, wenn das Array eine leere Zeichenfolge ('" "') enthält, es einen Absturz verursacht: 'fataler Fehler: kann nicht vor startIndex dekrementieren'. –

+0

Ja, ich weiß, dass ich eine Annahme hinzugefügt habe, aber es scheint, dass das OP sowieso nicht leere Strings sortieren möchte. – vadian

0

Keinen Zweifel, es ist. Durch die Verwendung von sorted(by:), können Sie es wie folgt tun:

let myArray = ["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2", 
       "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"] 

let sortedArray = myArray.sorted { 
    guard let str1LastChar = $0.characters.last, let str2LastChar = $1.characters.last else { 
     return false 
    } 

    return str1LastChar < str2LastChar 
} 

print(sortedArray) 

Beachten Sie, dass, wenn myArray eine leere Zeichenfolge enthält ("") sollte die Art wie sein.

+2

Aber (es sei denn, ich irre mich wieder), gibt es immer noch ein Problem: Mit a = "X", b = "", c = "Y": (a, b) sind unvergleichbar und (b, c) sind unvergleichbar. Dann muss (a, c) auch unvergleichbar sein, aber das sind sie nicht. - Eine * symmetrische * Bedingung, die 'falsch' zurückgibt, erscheint mir immer verdächtig. –

+0

Ich denke, dass Ihr Punkt mir jetzt klar ist, ist es etwas, das der Logik der transitiven Eigenschaft ähnlich ist, richtig? die aktuelle Ausgabe für die Sortierung "[" X "," "," Y "]' sollte gleich sein, ohne zu bearbeiten ... –

+0

Es heißt "Transitivität der Inkompatibilität" in https://en.wikipedia.org/ wiki/Weak_ordering # Strict_weak_orderings und stellt sicher, dass die Elemente vollständig nach '<' geordnet sind (wobei "unvergleichbare" Elemente "gleich" sind) - Natürlich ist das alles nur dann von Bedeutung, wenn * leere Zeichenfolgen vorhanden sind. –

Verwandte Themen