在Swift3中对数组进行排序

Nar*_*san 10 arrays sorting swift swift3

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

struct Object {
    var name: String
    var count: Int
Run Code Online (Sandbox Code Playgroud)

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

是否有一种简单的方法来
a)按字母顺序对它们进行排序
b)按升序对它们进行数字排序

基本上,会有一个像这样的数组: [Object1, Object2, Object3].每个Object都有一个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
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,这已经sorted(by: )在Swift3中重命名了,我不会放弃如何做到这一点.

Rob*_*Rob 25

如果要按字母顺序排序,然后按数字排序,则可以:

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

这产生:

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

我添加A10到你的数组中,因为没有它,一个简单的字母排序就足够了.但我假设你想要A10之后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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,更简洁:

array.sort { $0.name == $1.name ? $0.count < $1.count : $0.name < $1.name }
Run Code Online (Sandbox Code Playgroud)

要么

array.sort { ($0.name, $0.count) < ($1.name, $1.count) }
Run Code Online (Sandbox Code Playgroud)

注意,我不是将这个逻辑放在闭包中,而是实际上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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以执行以下操作以进行排序:

var array = ...
array.sort()
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想对原始阵列进行排序,则可以返回新阵列:

let array = ...
let sortedArray = array.sorted()
Run Code Online (Sandbox Code Playgroud)


ffa*_*bri 11

Narusan,也许这会对你有所帮助.假设您有一个名为objArray的结构对象的数组,那么您可以通过以下代码对其进行排序:

var objArray = [Object]()
objArray.append(Object(name:"Steve", count:0))
objArray.append(Object(name:"Alex", count:1))

objNameSorted = objArray.sorted (by: {$0.name < $1.name})
objNCountSorted = objArray.sorted (by: {$0.count < $1.count})
Run Code Online (Sandbox Code Playgroud)


kak*_*bei 6

您仍然可以使用速记sorted

objNameSorted = objArray.sorted { $0 < $1 }
Run Code Online (Sandbox Code Playgroud)

虽然可读性较差,但它更接近地模仿sort语法。