【问题标题】:Sorting/Accessing Arrays nested in Dictionaries排序/访问嵌套在字典中的数组
【发布时间】:2021-05-30 00:36:33
【问题描述】:

我已经了解如何对嵌套在字典中的字典进行排序,但我似乎无法对嵌套在字典中的数组进行排序。

这是我尝试排序的示例。

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[1].value})

如何让排序功能发挥作用?

【问题讨论】:

  • 您希望排序后的结果是什么?
  • 啊,我希望排序结果是另一个字典,按 10、3 和 1 的键值排序(而不是像上面那样的 3、1 和 10),因为它们正在被排序由数组中的第二个元素。
  • 似乎每个数组都代表某种人?第一个元素是(一个人的)名字,第二个元素是那个人的年龄(?),第三个元素是那个人的出生月份吗?数组的每个元素都有含义吗?
  • 是的,每个数组都包含人的信息,每个key就是人的身份证号。
  • 我正在尝试按年龄对信息进行排序,但它不起作用。

标签: arrays sorting dictionary nested swift5


【解决方案1】:

快速而肮脏的解决方案是:

let sortedKVPs = dictionary.sorted(by: { ($0.value[1] as! Int) < ($1.value[1] as! Int) })

注意它是$0.value[1]。 $0 是键值对,$0.value 是数组,$0.value[1] 是该数组的第二个元素。您还需要向 Swift 保证数组的第二个元素确实是带有强制转换的 Int (as! Int)。

您的数组同时包含Strings 和Ints,因此其类型被推断为[Any]。编译器不能知道这个数组的每个元素的类型,因为你可以在里面放任何东西。 $0.value[1] 和 $1.value[1] 可能是不同的、不可比较的类型,这就是为什么不能使用 &lt; 直接比较它们的原因。

另外需要注意的是排序后的结果不是字典。它是一个键值对数组,因为字典不是有序的,只有数组是有序的。


虽然上述解决方案有效,但它非常脆弱。由于每个数组都代表一个人,因此您应该创建一个 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 { $0.age < $1.age }

【讨论】:

  • 我试过了,但我得到四个错误:“无法将'Int'类型的值转换为闭包结果类型'Bool',一行上的连续语句必须用';'分隔插入';'”和其他两个,包括“预期表达式”
  • 我承认代码真的很难使用。老实说,我更喜欢使用元组或嵌套字典,但我的作业说明告诉我只使用一个字典,键是人的身份证号,并使用多个数组来排列人的其余信息。跨度>
  • 我想我使用的字典可能会有所帮助。我正在尝试按数组中的第 10 个元素排序(数字是双精度/浮点数)。
  • 这是我正在使用的字典的一部分:dictionary = [22: ["Ryan Carpenter", 22, "Forward CR", 200, 33256, "Oviedo, FL, USA", 72,“1/18/1991”,“一月”,“美国”,30.1108829568789],77:[“柯比达赫”,77,“前锋 CR”,197,36912,“萨斯喀彻温堡,AB,CAN”,76 , "1/21/2001", "一月", "CAN", 20.1013004791239], 12: ["Alex DeBrincat", 12, "Forward LWR", 165, 35782, "Farmington Hills, MI, USA", 67 , "12/18/1997", "December", "USA", 23.1950718685832], 38: ["Brandon Hagel", 38, "Forward LW L", 174, 36034, "Saskatoon, SK, CAN", 71, “8/27/1998”、“8 月”、“CAN”、22.5051334702259]]
猜你喜欢
  • 2013-10-06
  • 2014-09-13
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2012-07-26
相关资源
最近更新 更多