2017-08-13 22 views
2

如何重寫此代碼,以便按照以下方式對字符串數組進行排序:首先,搜索詞作爲前綴的字符串。其次,只包含搜索詞的字符串。最後,按字母順序排序。如何重寫此switch語句,以便以特定方式對字符串數組進行排序

stringArray = stringArray.sorted(by: { 
    switch ($0.hasPrefix(searchTerm), $1.hasPrefix(searchTerm) { 
    case (true, true): return $0 < $1 ; 
    case (true, false): return true ; 
    case (false, true): return false ; 
    case (false, false): return $0 < $1 
}}) 

回答

2

你只需要改變switch語句的最後一種情況,因爲你只需要改變順序,如果沒有當前,也不是下一個元素與搜索關鍵詞開始,否則你還是喜歡元素開始searchTerm勝過其他任何東西。

在這兩個元素都沒有前綴的情況下,您檢查它們中是否包含searchTerm,並且您以與以前完全相同的方式處理結果。

stringArray = stringArray.sorted(by: { 
    switch ($0.hasPrefix(searchTerm), $1.hasPrefix(searchTerm)){ 
    case (true, true): return $0 < $1 
    case (true, false): return true 
    case (false, true): return false 
    case (false, false): 
     switch ($0.contains(searchTerm), $1.contains(searchTerm)) { 
     case (true, true): return $0 < $1 
     case (true, false): return true 
     case (false, true): return false 
     case (false, false): return $0 < $1 
     } 
}}) 

此代碼已在操場上測試過,並按預期工作。使用下面的測試案例:

let stringArray = ["b","ba","c","d","da","ae","aa","fae","a"] 
let searchTerm = "a" 

結果爲:["a", "aa", "ae", "ba", "da", "fae", "b", "c", "d"]

+1

你是男人Dávid!感謝你的偉大工作! –

1

怎麼樣值綁定,where子句和通配符模式?

var stringArray = ["b","ba","c","d","da","ae","aa","fae","a"] 
let searchTerm = "a" 

stringArray = stringArray.sorted(by: { 
    switch ($0.hasPrefix(searchTerm), $1.hasPrefix(searchTerm)){ 
    case (true, true): return $0 < $1 
    case (false, false): 
     switch ($0.contains(searchTerm), $1.contains(searchTerm)) { 
     case (let x, let y) where x == y: return $0 < $1 
     case (let x, _): return x 
     } 
    case (let x, _): return x 
}}) 

print(stringArray.description) 
相關問題