web-dev-qa-db-ja.com

Swift3での配列の並べ替え

私のコードには、次のような構造体があります。

_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: )に名前が変更されており、その方法の取得をやめません。

10
Narusan

アルファベット順にソートしてから数値でソートする場合、次のことができます。

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

それは生成します:

[「A1」、「A2」、「A4」、「A10」、「B7」、「C3」]

追加した A10配列に。これがなければ、単純なアルファベット順のソートで十分だったからです。しかし、私はあなたがA10A4。この場合、数値比較がジョブを実行します。


サンプルを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) }

このロジックをクロージャに入れるのではなく、実際にFooComparableに準拠させることに注意してください。

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

ナルサン、多分これはあなたを助けるでしょう。 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})
11
ffabri

sortedの省略形を引き続き使用できます:

objNameSorted = objArray.sorted { $0 < $1 }

読みにくくなりますが、sort構文をより厳密に模倣します。

4
kakubei