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都有一个name
和count
属性,我希望通过这两个属性对该列表中的对象进行排序.
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)
您仍然可以使用速记sorted
:
objNameSorted = objArray.sorted { $0 < $1 }
Run Code Online (Sandbox Code Playgroud)
虽然可读性较差,但它更接近地模仿sort
语法。