Sorting/Accessing 嵌套在字典中的数组
Sorting/Accessing Arrays nested in Dictionaries
我已经看到如何对嵌套在字典中的字典进行排序,但我似乎无法对嵌套在字典中的数组进行排序。
这是我要排序的示例。
var dictionary = [3: ["name1", 30, "birthmonth1", 30.50293], 1: ["name2", 35, "birthmonth2", 25.17633], 10: ["name3", 25, "birthmonth3", 32.49927]]
我在Swift 5中尝试过各种排序。但是,我更熟悉python和javascript。
例如:
var sortBySecondElement = dictionary.sorted(by: {0[1].value < [1].value})
如何让排序功能发挥作用?
快速而简单的解决方案是:
let sortedKVPs = dictionary.sorted(by: { ([=10=].value[1] as! Int) < (.value[1] as! Int) })
注意是[=13=].value[1]
。 [=14=]
是键值对,[=15=].value
是数组,[=13=].value[1]
是该数组的第二个元素。您还需要保证 Swift 数组的第二个元素确实是带有强制转换的 Int
(as! Int
).
您的数组同时包含 String
和 Int
,因此它的类型被推断为 [Any]
。编译器无法知道该数组中每个元素的类型,因为您可以在其中放入任何字面意思的内容。 [=13=].value[1]
和 .value[1]
可能属于不同的、不可比较的类型,这就是为什么您不能使用 <
直接比较它们的原因。
另外需要注意的是,排序后的结果不是字典。它是一个键值对数组,因为字典没有排序,只有数组才排序。
虽然上述解决方案可行,但它非常脆弱。由于每个数组代表一个人,因此您应该创建一个 Person
结构来代表一个人,而不是一个数组:
struct Person {
let name: String
let age: Int
let birthMonth: Int
let someOtherProperty: Double // I don't know what the fourth element in the array means
}
let dictionary = [
3: Person(name: "name1", age: 30, birthMonth: 1, someOtherProperty: 30.50293),
...
]
现在排序变得很容易了:
let sortedKVPs = dictionary.sorted { [=12=].age < .age }
我已经看到如何对嵌套在字典中的字典进行排序,但我似乎无法对嵌套在字典中的数组进行排序。
这是我要排序的示例。
var dictionary = [3: ["name1", 30, "birthmonth1", 30.50293], 1: ["name2", 35, "birthmonth2", 25.17633], 10: ["name3", 25, "birthmonth3", 32.49927]]
我在Swift 5中尝试过各种排序。但是,我更熟悉python和javascript。
例如:
var sortBySecondElement = dictionary.sorted(by: {0[1].value < [1].value})
如何让排序功能发挥作用?
快速而简单的解决方案是:
let sortedKVPs = dictionary.sorted(by: { ([=10=].value[1] as! Int) < (.value[1] as! Int) })
注意是[=13=].value[1]
。 [=14=]
是键值对,[=15=].value
是数组,[=13=].value[1]
是该数组的第二个元素。您还需要保证 Swift 数组的第二个元素确实是带有强制转换的 Int
(as! Int
).
您的数组同时包含 String
和 Int
,因此它的类型被推断为 [Any]
。编译器无法知道该数组中每个元素的类型,因为您可以在其中放入任何字面意思的内容。 [=13=].value[1]
和 .value[1]
可能属于不同的、不可比较的类型,这就是为什么您不能使用 <
直接比较它们的原因。
另外需要注意的是,排序后的结果不是字典。它是一个键值对数组,因为字典没有排序,只有数组才排序。
虽然上述解决方案可行,但它非常脆弱。由于每个数组代表一个人,因此您应该创建一个 Person
结构来代表一个人,而不是一个数组:
struct Person {
let name: String
let age: Int
let birthMonth: Int
let someOtherProperty: Double // I don't know what the fourth element in the array means
}
let dictionary = [
3: Person(name: "name1", age: 30, birthMonth: 1, someOtherProperty: 30.50293),
...
]
现在排序变得很容易了:
let sortedKVPs = dictionary.sorted { [=12=].age < .age }