2017-07-23 96 views
0

我想根據最後一個字符對我的字符串數組進行排序。這裏是我的字符串數組:基於Swift中最後一個字符的字符串排序

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

現在我想根據這是最後下劃線(_)最後一個值這個數組排序。 可能嗎?

感謝

+2

最後一個下劃線總是跟着一個數字嗎?或者它可以是多位數字或其他字符?如果是的話:他們應該如何排序,數字或字符串?如果足夠的話會怎麼樣? - 涵蓋所有可能案例的精確問題陳述總是一個好的開始。 –

回答

2

sorted可以提供例如自定義排序條件(假設所有字符串不是空的)

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

我可以提到,如果數組包含一個空字符串('「」'),它會導致崩潰:'致命錯誤:不能在startIndex之前遞減。 –

+0

是的,我知道我添加了一個假設,但似乎OP想要排序非空字符串。 – vadian

0

毫無疑問,這是。通過使用sorted(by:),你可以做這樣的:

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) 

注意,如果myArray包含任何空字符串("")排序應爲是。

+2

但是(除非我誤會),仍然存在一個問題:a =「X」,b =「」,c =「Y」:(a,b)是無法比擬的,(b,c)是無法比擬的。然後(a,c)也必須是無法比擬的,但它們不是。 - 返回'false'的* *對稱*條件總是看起來可疑。 –

+0

我認爲你的觀點現在對我來說很清楚,它類似於傳遞性屬性邏輯,對吧?排序'[「X」,「」,「Y」]'的當前輸出應該是相同的,不需要編輯... –

+0

它在https://en.wikipedia.org/中被稱爲「不可比性的傳遞性」 wiki/Weak_ordering#Strict_weak_orderings並確保元素完全按照<<(「不可比」元素爲「相等」)進行排序 - 當然,所有這些只在*有*空字符串時才起作用。 –

相關問題