Ios Swift-字典中的存储值顺序完全改变

Ios Swift-字典中的存储值顺序完全改变,ios,swift,dictionary,nsdictionary,ordereddictionary,Ios,Swift,Dictionary,Nsdictionary,Ordereddictionary,我试图显示字典格式的数据。下面是三次尝试。第一次尝试时,输出顺序完全改变。第二次尝试,输出顺序与输入相同。但是,在第三次尝试中,我将变量声明为NSDictionary。我收到的确切输出。为什么词典会有这样的变化?请引导我。我搜索了斯威夫特的字典标签。但我没发现 //First Attempt var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"] println(dict) //output: [name2: Roy

我试图显示字典格式的数据。下面是三次尝试。第一次尝试时,输出顺序完全改变。第二次尝试,输出顺序与输入相同。但是,在第三次尝试中,我将变量声明为NSDictionary。我收到的确切输出。为什么词典会有这样的变化?请引导我。我搜索了斯威夫特的字典标签。但我没发现

//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;
}
另一个问题:我用操场来验证。我的屏幕截图如下:

在这里,在NSDictionary中,我首先给出了name5,但在右侧显示name2,然后在println中,它以升序显示。为什么会发生这种情况

这里,在Dictionary中,我首先给出了name5,但在右侧,name2显示,然后在println中,它显示了Dictionary行中如何使用它。为什么会发生这种情况???

来自:

字典存储集合中相同类型的键和相同类型的值之间的关联,该集合没有定义顺序


基本上,输出中显示的项目顺序是任意的,取决于数据结构的内部实现,不应依赖于此。

您不能对字典进行排序,但可以对其键进行排序并按如下方式循环:

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)" )
}
let myDictionary=[“name1”:“Loy”,“name2”:“Roy”,“name3”:“Tim”,“name4”:“Steve”]/[“name1”:“Loy”,“name2”:“Roy”,“name3”:“Tim”,“name4”:“Steve”]
让sorted=myDictionary.sorted{$0.key<$1.key}//或{$0.value<$1.value}使用字典值进行排序
打印(已排序)/“[(键:“name1”,值:“Loy”),(键:“name2”,值:“Roy”),(键:“name3”,值:“Tim”),(键:“name4”,值:“Steve”)]\n”
对于排序中的元素{
打印(“Key=\(element.Key)Value=\(element.Value)”)
}

这是因为字典的定义:

字典 字典在没有定义顺序的集合中存储相同类型的键和相同类型的值之间的关联

没有顺序,它们的结果可能会与放入的不同
这与NSSet相当


编辑:

字典 字典收集键值对。NSDictionary不是简单地维护有序或无序的对象集合,而是根据给定的键存储对象,然后可以使用这些键进行检索


也有无顺序,但出于调试目的,打印时有排序。

既没有NSDictionary也没有Swift::Dictionary对其存储进行排序。不同之处在于,一些
NSDictionary
对象在打印时对其输出进行排序,而
Swift::Dictionary
则不进行排序

-[NSDictionary description]
的文档中:

如果字典中的每个键都是NSString对象,则条目为 按键升序列出,否则为 列出的条目未定义。该物业旨在产生 可读输出,用于调试目的,不用于序列化数据


这确实是字典的问题。但是,有一个库可以确保订单保持您初始化的方式

OrderedDictionary是Swift中有序字典数据结构的轻量级实现

OrderedDictionary结构是一个不可变的泛型集合,它结合了Swift标准库中字典和数组的功能。和字典一样,它存储键值对并将每个键映射到一个值。和数组一样,它存储那些通过基于零的整数索引排序和访问的对

在这里查看:

派对有点晚了,但如果您想维持订单,然后使用,这里的权衡是,如果您使用
KeyValuePairs
,您将失去维护列表中唯一元素的功能

var user: KeyValuePairs<String, String> {
    return ["FirstName": "NSDumb",
            "Address": "some address value here",
            "Age":"30"]
}

从本质上讲,字典不是按顺序设计的,这意味着它们不应该按顺序排列(尽管它们可以按顺序排列!)

从:

字典是一种哈希表,提供对其包含的条目的快速访问。表中的每个条目都使用其键进行标识,该键是可哈希类型,如字符串或数字。您可以使用该键检索相应的值,该值可以是任何对象。在其他语言中,类似的数据类型称为哈希或关联数组

这需要一些关于数据结构的基本知识,我将简要地对其进行概述和简化


不使用字典存储关联数据 考虑一下,如果没有字典,您必须使用元组数组来存储有关不同水果及其颜色的信息,另一个答案是:

let数组=[
(“苹果”、“红色”),
(“香蕉”、“黄色”),
// ...
]
如果你想找到一个水果的颜色,你必须遍历每个元素并检查它的水果值,然后返回颜色部分

字典使用表示所存储密钥的唯一散列来优化其存储,以存储数据。对于swift来说,这意味着在这种情况下,将我们的钥匙从
字符串
-转换为
Int
。Swift使用基于
Int
的哈希,我们知道这一点,因为我们都阅读了,并且我们看到
Hashable
定义了一个
hashValue
属性,该属性返回
Int


使用字典存储关联数据 使用字典的好处是可以快速读取和写入数据;它使“查找”相关数据变得简单快捷。通常情况下,时间复杂度为O(1),尽管apple文档没有指定,可能是因为它取决于密钥类型的哈希函数实现

let字典=[
“苹果”:“红色”,
“香蕉”:“黄色”
// ...
]
权衡是,订单通常不保证存在
["FirstName": "NSDumb", "Address": "some address value", "Age": "30"]