gpt4 book ai didi

arrays - 在 Swift3 中对数组进行排序

转载 作者:IT王子 更新时间:2023-10-29 05:32:29 25 4
gpt4 key购买 nike

在我的代码中,我有一个如下所示的结构:

struct Object {
var name: String
var count: Int

我现在正在创建一个包含 10 个具有随机名称和随机计数的对象的数组。

有没有简单的方法
a) 按字母顺序排序
b) 按数字升序对它们进行排序

基本上,会有这样一个数组:[对象 1、对象 2、对象 3]。每个对象都有一个 namecount 属性,我希望通过这两个属性对该列表中的对象进行排序。

Swift2 中的解决方案(使用此解决方案:StackOverflow):

Object.sort{
if $0.name != $1.name {
return $0.name < $1.name
}
else {
//suits are the same
return $0.count < $1.count
}
}

然而,这在 Swift3 中已被重命名为 sorted(by: ),我不会放弃如何去做。

最佳答案

如果你想先按字母排序再按数字排序,你可以:

var array = ["A2", "B7", "A4", "C3", "A1", "A10"]
array.sort { $0.compare($1, options: .numeric) == .orderedAscending }

产生:

["A1", "A2", "A4", "A10", "B7", "C3"]

我将 A10 添加到您的数组中,因为没有它,简单的字母排序就足够了。但我假设您在 A4 之后想要 A10,在这种情况下,数字比较将为您完成这项工作。


您将示例更改为具有两个属性的结构。在这种情况下,您可以执行以下操作:

struct Foo {
var name: String
var count: Int
}

var array = [
Foo(name:"A", count: 2),
Foo(name:"B", count: 7),
Foo(name:"A", count: 7),
Foo(name:"C", count: 3),
Foo(name:"A", count: 1),
Foo(name:"A", count: 10)
]

array.sort { (object1, object2) -> Bool in
if object1.name == object2.name {
return object1.count < object2.count
} else {
return object1.name < object2.name
}
}

或者,更简洁:

array.sort { $0.name == $1.name ? $0.count < $1.count : $0.name < $1.name }

或者

array.sort { ($0.name, $0.count) < ($1.name, $1.count) }

请注意,我没有将此逻辑放在闭包中,而是让 Foo 符合 Comparable:

struct Foo {
var name: String
var count: Int
}

extension Foo: Equatable {
static func ==(lhs: Foo, rhs: Foo) -> Bool {
return (lhs.name, lhs.count) == (rhs.name, rhs.count)
}
}

extension Foo: Comparable {
static func <(lhs: Foo, rhs: Foo) -> Bool {
return (lhs.name, lhs.count) < (rhs.name, rhs.count)
}
}

这使比较逻辑很好地封装在它所属的 Foo 类型中。

然后您可以执行以下操作来就地排序:

var array = ...
array.sort()

或者,如果您不想就地排序原始数组,您可以返回一个新数组:

let array = ...
let sortedArray = array.sorted()

关于arrays - 在 Swift3 中对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41648171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com