2016-07-27 132 views
1

檢查以下詞典:如何在Swift中排序字典鍵?

var testDict: [String : Int] = [ 
    "a" : 1, 
    "b" : 2, 
    "c" : 3, 
    "d" : 4 
] 

現在,通過字典的鍵迭代:

for i in testDict.keys { 
    print(i) 
} 

這產生以下輸出:

BACD

但是,預期的產量無LD是在編碼順序的鍵:

A B C d

由於這不是這種情況,我假定鍵進行排序。如果是這樣,他們是如何排序的,更重要的是,他們怎樣才能返回到他們寫的順序呢?

+5

字典不是一個有序的集合。 – Moritz

回答

4

Apple's docs

不同於陣列中的項目,在字典中的項目不具有 指定順序

總之,字典項目未排序,它們是作爲有效地存儲儘可能通過他們的hash值(你不應該對訂單做任何假設),這就是爲什麼:這就是爲什麼:

字典密鑰類型必須符合Hashable協議,如 集合的值類型。

對於第二個問題,由於字典沒有排序,所以不能將值或鍵內部返回到原始順序(因爲它沒有)。你可以做的,是一切價值和鍵遍歷以特定的順序,如:

let dic = ["a" : 1, "b" : 2, "c" : 3, "d" : 4] 
for key in dic.keys.sort(<) { 
    print("key: \(key), value: \(dic[key])") 
} 
0

字典(SWIFT或NSDictionary)是一個關鍵值映射。概念沒有秩序。您放入一個值(鍵)並獲取該鍵的另一個值(值)。這不取決於任何順序。

如果你想有一個鍵的順序,獲取鍵和排序。

順便說一句:有序和排序有區別。有序的意思是,一個元素保持它的位置。無論排序方式如何,此訂單都可以排序。

以示區別覺得字典創建這樣的:

var testDict: [String : Int] = [ 
    "b" : 2, 
    "a" : 1, 
    "c" : 3, 
    "d" : 4 
] 

如果字典將被排序,你的代碼的結果將是:B,A,C,d。這是字典創建的訂單。但它沒有排序。 (排序如何?註音?字面?字母數字?)

排序的數組(也稱爲元素的位置)也未排序。作爲NSArray的同類有序集合,即使沒有辦法對它們進行排序,也會保留訂單:請考慮包含字符串,數字和圖像的數組。數組保留了你放置物品的順序,但是它沒有辦法對它進行排序。 (再次說明:無論什麼排序都意味着什麼。)在Swift的整個生物圈中,Objective-C和Foundation只有一個排序集合:NSIndexSet