2016-07-27 98 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