Swift3中的排序数组

鸣山

在我的代码中,我有一个类似以下的结构:

struct Object {
    var name: String
    var count: Int

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

有没有一种简单的方法可以
a)按字母顺序对其进行排序
b)按升序对其进行数字排序

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

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

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”]

我添加A10到您的数组中,因为没有它,简单的字母排序就足够了。但是我假设您想要A10after 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 }

要么

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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章