【问题标题】:Sort an array of tuples in swift 3在swift 3中对一组元组进行排序
【发布时间】:2017-04-28 00:47:58
【问题描述】:

您好,我有以下内容

class MyClass {
  var myString: String?
}

var myClassList = [String: MyClass]()

我想通过 Swift 3 中的 myString 变量按字母顺序对这个数组进行排序吗?

【问题讨论】:

  • myClassList 是字典而不是数组。我建议您在进行排序之前先正确设置数据结构。
  • myClassList.sorted{($0.value.myString ?? "") < ($1.value.myString ?? "")}

标签: arrays swift sorting swift3 tuples


【解决方案1】:

如上所述,您有一本字典,而不是元组。 但是,字典确实有一个 sorted(by:) 方法,您可以使用该方法对键/值对元组数组进行排序。这是一个例子:

var m: [String: Int] = ["a": 1]
let n = m.sorted(by: { (first: (key: String, value: Int), second: (key: String, value: Int)) -> Bool in
  return first.value > second.value
})

这已扩展以显示闭包的完整签名,但很容易简写为:

let n = m.sorted(by: {
  return $0.value > $1.value
})

此外,您还可以对字典执行其他枚举

m.forEach { (element: (key: String, value: Int)) in
  print($0.value)
}

所有这一切都归功于 Swift 中的集合和序列协议层次结构,它们是一些非常好的抽象。

【讨论】:

  • 如果你去掉括号,你可以省略by:。您也可以省略return关键字。顺便说一句,他说他想按 myString 属性排序
  • 在这种情况下,我希望字符串按字母顺序排列。
  • @LeoDabus 检查xcode,字典只有sorted(by:),这意味着你不能在括号中省略by,但是如果你使用尾随闭包语法,你可以(虽然在风格上不喜欢排序/映射/过滤)
【解决方案2】:

很酷的问题!虽然我想首先指出 [String: MyClass] 是字典而不是 Tupule。

不过,Swift 确实支持元组。您的元组的语法如下所示:

var tupule: (String, MyClass) = (foo, bar)

然后你需要将它们组成一个数组:

var tupules:[(String, MyClass)] = [(foo, bar), (up, dog)]

然后你可以对该数组进行排序:

tupules.sort({ $0[1].myString > $1[1].myString })

尽管您可能应该定义一个更健壮的排序机制。

这些是排序闭包的内容:

$0 是需要比较的对象之一,$1 是另一个。 $0[1]$1[1] 访问对象的 1 索引,在这种情况下,根据您的元组中的定义,它是您的自定义对象 MyClass

希望这会有所帮助。

【讨论】:

  • 可以对字典进行排序,它返回一个元组数组(键,值)
【解决方案3】:

Swift 5.2.4 版

let arr = [(0, 5), (1, 2), (2, 4), (3, 1), (4, 3)] // -> [(3, 1), (1, 2), (4, 3), (2, 4), (0, 5)]
let sorted = arr.sorted{ $0.1 < $1.1 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多