McD*_*_11 20 nsdictionary ios swift
我试图显示字典格式的数据.下面,有三次尝试.首次尝试,输出顺序完全改变.第二次尝试,输出顺序与输入相同.但是,在第三次尝试中,我将变量声明为NSDictionary.我收到的确切输出.为什么这会改变字典?请指导我.我搜索了Swift的字典标签.但我找不到.
//First Attempt
var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"]
println(dict)
//output:
[name2: Roy, name1: Loy]
//Second Attempt
var dict : Dictionary = ["name2" : "Loy", "name1" : "Roy"]
println(dict)
//output:
[name2: Loy, name1: Roy]
-----------------------------------------------------------
//Third Attempt With NSDictionary
var dict : NSDictionary = ["name1" : "Loy", "name2" : "Roy"]
println(dict)
//output:
{
name1 = Loy;
name2 = Roy;
}
Run Code Online (Sandbox Code Playgroud)
另一个问题:我用游戏场进行验证.我的屏幕截图如下:

在这里,在NSDictionary中,我首先给了name5,但是在右边name2显示,然后,在println中,它以升序显示.为什么会这样?

在这里,在字典中,我给了name5作为第一个,但是在右边name2正在显示,然后,在println中,它正在显示它是如何在Dictionary行上拍摄的.为什么会这样?
Sch*_*cal 14
这是因为字典的定义:
字典存储相同类型的键与集合中相同类型的值之间的关联,而没有定义的排序.
有没有命令,他们可能会以不同走出来比并投入,
这与NSSet中.
编辑:
字典收集键值对.NSDictionary不是简单地维护有序或无序的对象集合,而是根据给定的密钥存储对象,然后可以将其用于检索.
目前还 没有任何订单,但没有对打印排序进行调试.
Leo*_*bus 10
您无法对字典进行排序,但您可以对其键进行排序并循环遍历它们,如下所示:
let myDictionary = ["name1" : "Loy", "name2" : "Roy", "name3" : "Tim", "name4" : "Steve"] // ["name1": "Loy", "name2": "Roy", "name3": "Tim", "name4": "Steve"]
let sorted = myDictionary.sorted {$0.key < $1.key} // or {$0.value < $1.value} to sort using the dictionary values
print(sorted) // "[(key: "name1", value: "Loy"), (key: "name2", value: "Roy"), (key: "name3", value: "Tim"), (key: "name4", value: "Steve")]\n"
for element in sorted {
print("Key = \(element.key) Value = \(element.value)" )
}
Run Code Online (Sandbox Code Playgroud)
聚会有点晚了,但如果你想保持顺序,然后使用KeyValuePairs,这里的权衡是,如果你使用KeyValuePairs你会失去维护列表中唯一元素的能力
var user: KeyValuePairs<String, String> {
return ["FirstName": "NSDumb",
"Address": "some address value here",
"Age":"30"]
}
Run Code Online (Sandbox Code Playgroud)
印刷
["FirstName": "NSDumb", "Address": "some address value", "Age": "30"]
Run Code Online (Sandbox Code Playgroud)
字典本质上并不是为了有序而设计的,这意味着它们不应该是有序的(尽管它们可以是有序的!)。
\n\n\n\n\n\n\n字典是一种哈希表,提供对其包含的条目的快速访问。表中的每个条目都使用其键来标识,该键是可散列类型,例如字符串或数字。您使用该键来检索相应的值,该值可以是任何对象。在其他语言中,类似的数据类型称为哈希或关联数组。
\n
这需要一些数据结构的基本知识,我将简要概述和简化这些知识。
\n\n考虑一下,如果没有字典,您必须使用元组数组来存储有关不同水果及其颜色的一些信息,正如另一个答案所建议的:
\n\nlet array = [\n ("Apple", "Red"),\n ("Banana", "Yellow"),\n // ...\n]\nRun Code Online (Sandbox Code Playgroud)\n\n如果你想找到水果的颜色,你必须循环遍历每个元素并检查水果的值,然后返回颜色部分。
\n\n字典使用散列函数来优化其存储,以使用表示所存储的键的唯一散列来存储数据。对于 swift 来说,这意味着将我们的 key\xe2\x80\x94 在这种情况下将String\xe2\x80\x94 转换为Int. Swift 使用Int基于哈希值,我们知道这一点是因为我们都阅读了Hashable协议文档,并且我们看到它Hashable定义了hashValue一个返回Int.
使用字典的好处是可以快速读取数据并快速写入数据;它使“查找”相关数据变得简单快捷。通常是 O(1) 时间复杂度,尽管苹果文档没有指定,可能是因为它取决于密钥类型的哈希函数实现。
\n\nlet dictionary = [\n "Apple": "Red",\n "Banana": "Yellow"\n // ...\n]\nRun Code Online (Sandbox Code Playgroud)\n\n代价是订单通常不能保证被保留。不保证意味着您可能会很幸运,并且可能是相同的顺序,但事实并非如此,所以不要依赖它。
\n\n作为一个任意的例子,也许字符串"Banana"被散列成数字0,并"Apple"变成4。既然我们现在有了一个Int,我们可以在底层将我们的字典表示为一个大小为 5 的数组:
// what things *might* look like under, the hood, not our actual code\n// comments represent the array index numbers\nlet privateArrayImplementationOfDictionary = [\n "Yellow", // 0\n nil, // 1\n nil, // 2\n nil, // 3\n "Red", // 4\n] // count = 5\nRun Code Online (Sandbox Code Playgroud)\n\n您会注意到,我们已将键转换为数组索引,并且有一堆空白,其中我们什么都没有。由于我们使用的是数组,因此我们可以快速插入数据,并同样快速地检索数据。
\n\n这些nil空间是为以后可能出现的更多值保留的,但这也是为什么当我们尝试从字典中获取值时,它们可能为零。因此,当我们决定添加更多值时,例如:
dictionary["Lime"] = "Green" // pretend hashValue: 2\ndictionary["Dragonfruit"] = "Pink" // pretend hashValue: 1\nRun Code Online (Sandbox Code Playgroud)\n\n我们的字典在底层可能看起来像这样:
\n\n// what things *might* look like under, the hood, not our actual code\n// comments represent the array index numbers\nlet privateArrayImplementationOfDictionary = [\n "Yellow", // 0 ("Banana")\n "Pink", // 1 ("Dragonfruit")\n "Green", // 2 ("Lime")\n nil, // 3 (unused space)\n "Red", // 4 ("Apple")\n] // count = 5\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,这些值根本不按照我们输入的顺序存储。事实上,钥匙根本不在那儿。这是因为哈希函数已将我们的键更改为其他内容,一组Int值为我们的实际存储机制提供了有效的数组索引,这是一个对世界隐藏的数组。
我确信这比您想要的信息更多,并且可能充满了许多不准确之处,但它为您提供了字典在实践中如何工作的要点,并希望听起来比“这就是它的工作原理”更好。
\n\n在搜索 Swift 字典的实际性能时,Swift 字典...是否为性能建立了索引?... StackOverflow提供了一些额外的可能的相关细节。
\n\n如果您仍然有兴趣了解更多详细信息,您可以尝试实现自己的词典作为学术练习。我还建议拿起一本关于数据结构和算法的书,有很多可供选择,不幸的是我没有任何建议给你。
\n\n您对本主题的了解越深入,您就越能理解为什么要使用一种特定的数据结构而不是另一种。
\n\n希望有帮助!
\n| 归档时间: |
|
| 查看次数: |
19709 次 |
| 最近记录: |