2017-09-30 28 views
-1

我使用這個代碼進行排序的字典:如何按字符串鍵排序字典?

var sortedArray = dict.sorted(by: {$0.0 < $1.0}) 

,它是排序,但不是我想它看到下面的方法:

INSEAD的

["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"] 
["1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "24", "3", "4", "5", "6", "7", "8", "9"] 

完全字典:

["17": 00:00:89, "12": 00:00:89, "20": 00:00:89, "23": 00:00:89, "19": 00:00:89, "22": 00:00:89, "13": 00:00:89, "9": 00:00:00, "8": 00:00:00, "6": 00:00:89, "7": 00:17:13, "name": G. Snyder, "24": 00:00:89, "14": 00:00:89, "16": 00:00:89, "18": 00:00:89, "15": 00:00:89, "2": 00:02:02, "11": 00:00:89, "1": 00:01:01, "3": 00:01:59, "4": 00:03:12, "21": 00:00:89, "10": 00:00:33, "5": 00:06:15] 

編輯:(仍然沒有工作)

var sortedArray = dict.sorted(by: {$0.0 < $1.0}) 
sortedArray.removeLast() 
sortedArray = dict.sorted(by: {Int($0.0)! < Int($1.0)!}) 
+1

是字典順序,因爲你面對的字符串,而不是數字的字典鍵進行排序 - '「2」'比'「做大」 「19」'。 – luk2302

+0

@ luk2302啊,好的。那麼,我需要做些什麼來改變這種情況呢? –

+0

你可以加上'dict'嗎?它會更清楚... –

回答

1

由於如何sorted(by:)的邏輯是做比較與給定元素的平等的邏輯,(不能排序不可比較的元件的陣列),輸出將基於如何比較應該 - 由於所述給定dict鍵是strings-(「1」字符是小於「2」)。

但是,您可能需要轉換的關鍵值的int,然後排序:

let sorted = dict.sorted { 
    if let key1Int = Int($0.key), let key2Int = Int($1.key) { 
     return key1Int < key2Int 
    } 

    return true 
} 

在這點上的排序應該是有效的,即使鍵值是uncastable爲int。

-1

當你的字典包含字符串,這些都是按字母順序排序。你可以嘗試是這樣的:

let sortedArray = dict.sorted(by: {Int($0.0)! < Int($1.0)!}) 

編輯: 如果不是所有的按鍵都一定要轉換爲數字,我們必須使之更加複雜:

let sortedArray = dict.sorted(by: { 
    let a = Int($0.0) ?? 0 
    let b = Int($1.0) ?? 0 
    return a < b 
}) 

這使您的字典中的「名稱」頂部。

+0

致命錯誤:意外發現零而展開的可選值 –

+0

@WillMays好了,該解決方案還需要工作... –

+0

@WillMays哦,這是因爲其中一個關鍵是「名稱」。那是故意的嗎? –

2

可以使用泛型實例方法localizedStandardCompare

This method should be used whenever file names or other strings are presented in lists and tables where Finder-like sorting is appropriate. The exact sorting behavior of this method is different under different locales and may be changed in future releases. This method uses the current locale.

let dict = ["17": "00:00:89", "12": "00:00:89", "20": "00:00:89", "23": "00:00:89", "19": "00:00:89", "22": "00:00:89", "13": "00:00:89", "9": "00:00:00", "8": "00:00:00", "6": "00:00:89", "7": "00:17:13", "name": "G. Snyder", "24": "00:00:89", "14": "00:00:89", "16": "00:00:89", "18": "00:00:89", "15": "00:00:89", "2": "00:02:02", "11": "00:00:89", "1": "00:01:01", "3": "00:01:59", "4": "00:03:12", "21": "00:00:89", "10": "00:00:33", "5": "00:06:15"] 

let sortedTuples = dict.sorted{$0.key.localizedStandardCompare($1.key) == .orderedAscending} 
sortedTuples // [(key "1", value "00:01:01"), (key "2", value "00:02:02"), (key "3", value "00:01:59"), (key "4", value "00:03:12"), (key "5", value "00:06:15"), (key "6", value "00:00:89"), (key "7", value "00:17:13"), (key "8", value "00:00:00"), (key "9", value "00:00:00"), (key "10", value "00:00:33"), (key "11", value "00:00:89"), (key "12", value "00:00:89"), (key "13", value "00:00:89"), (key "14", value "00:00:89"), (key "15", value "00:00:89"), (key "16", value "00:00:89"), (key "17", value "00:00:89"), (key "18", value "00:00:89"), (key "19", value "00:00:89"), (key "20", value "00:00:89"), (key "21", value "00:00:89"), (key "22", value "00:00:89"), (key "23", value "00:00:89"), (key "24", value "00:00:89"), (key "name", value "G. Snyder")]