私のコードには、次のような構造体があります。
_struct Object {
var name: String
var count: Int
_
ランダムな名前とランダムなカウントを持つ10個のオブジェクトの配列を作成しています。
簡単な方法はありますか
a)アルファベット順に並べ替えます
b)数値を昇順に並べ替えます
基本的に、_[Object1, Object2, Object3]
_のような配列があります。すべてのオブジェクトにはname
およびcount
属性があり、これらの2つの属性を使用してそのリスト内のオブジェクトをソートする必要があります。
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
配列に。これがなければ、単純なアルファベット順のソートで十分だったからです。しかし、私はあなたがA10
後A4
。この場合、数値比較がジョブを実行します。
サンプルを2つのプロパティを持つ構造体に変更しました。その場合、次のようなことができます:
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()
ナルサン、多分これはあなたを助けるでしょう。 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})
sorted
の省略形を引き続き使用できます:
objNameSorted = objArray.sorted { $0 < $1 }
読みにくくなりますが、sort
構文をより厳密に模倣します。