1. ホーム
  2. swift

[解決済み] Swift - 複数条件でオブジェクトの配列を並べ替える

2022-05-15 04:48:53

質問

の配列があります。 Contact オブジェクトの配列があります。

var contacts:[Contact] = [Contact]()

連絡先クラスです。

Class Contact:NSOBject {
    var firstName:String!
    var lastName:String!
}

そして、その配列を lastName でソートし、次に firstName を受け取った連絡先がある場合、同じ lastName .

どちらかの基準でソートすることはできますが、両方はできません。

contacts.sortInPlace({$0.lastName < $1.lastName})

この配列をソートするために、さらに条件を追加するにはどうしたらよいでしょうか?

どのように解決するのですか?

複数の基準で並べ替えるとはどういうことか考えてみましょう。それは、2つのオブジェクトがまず1つの基準で比較されることを意味します。次に、それらの基準が同じであれば、次の基準によって結びつきを解消し、希望する順序になるまでこれを続けます。

let sortedContacts = contacts.sort {
    if $0.lastName != $1.lastName { // first, compare by last names
        return $0.lastName < $1.lastName
    }
    /*  last names are the same, break ties by foo
    else if $0.foo != $1.foo {
        return $0.foo < $1.foo
    }
    ... repeat for all other fields in the sorting
    */
    else { // All other fields are tied, break ties by last name
        return $0.firstName < $1.firstName
    }
}

ここで見ているのは Sequence.sorted(by:) メソッド これは、提供されたクロージャを参照して、要素がどのように比較されるかを決定するものです。

もしあなたのソートが多くの場所で使われるのであれば、あなたの型を Comparable プロトコル . そうすると Sequence.sorted() メソッド の実装を参照します。 Comparable.<(_:_:) 演算子 を使って、要素の比較方法を決定します。この方法で、任意の SequenceContact のように、ソートコードを重複させることなく、表示することができます。