Swift3 中的数组排序

2024-06-25

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

struct Object {
    var name: String
    var count: Int

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

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

基本上,会有一个像这样的数组:[Object1, Object2, Object3]。 每个对象都有一个name and count属性,我希望该列表中的对象通过这两个属性进行排序。

Swift2 中的解决方案(使用此解决方案:堆栈溢出) https://stackoverflow.com/questions/37603960/swift-sort-array-of-objects-with-multiple-criteria:

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

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


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

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

这会产生:

[“A1”、“A2”、“A4”、“A10”、“B7”、“C3”]

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


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

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 }

Or

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift3 中的数组排序 的相关文章