文書   >   Swift   >   Swift 標準ライブラリ   >   Collections   >   Sequence and Collection Protocols   >   MutableCollection   >   sort(by:)
インスタンスメソッド
sort(by:)
与えられた predicate (述語) を要素間の比較として使用して、コレクションをその場で並べ替えます。
宣言
mutating func sort(by areInIncreasingOrder: (Self.Element, Self.Element) throws -> Bool) rethrows
パラメータ
areInIncreasingOrder | 最初の引数が 2 番目の引数の前に順序付けされるべき場合は true を返す predicate (述語) 。それ以外の場合は false。並べ替え中に areInIncreasingOrder がエラーを throw すると、要素の順序が異なる場合がありますが、要素が失われることはありません。 |
議論
Comparable プロトコルに準拠していない要素のコレクションを並べ替える場合は、このメソッドにクロージャを渡します。このメソッドは、渡された最初の要素が 2 番目の要素の前に順序付けされるときに true を返します。
predicate (述語) は要素に対して 厳密に弱い順序 でなければなりません。つまり、任意の要素 a、b、および c に対して、以下の条件が成り立たなければなりません。
- areInIncreasingOrder(a, a) は常に falseです。 (非再帰性)
- areInIncreasingOrder(a, b) と areInIncreasingOrder(b, c) が共に true の場合、areInIncreasingOrder(a, c) もまた true です。 (推移比較可能性)
- 2 つの要素が、いずれも predicate (述語) に従って other の前に順序付けされていない場合、比較できない ものです。a と b が比較できず、b と c が比較できない場合、a と c も比較できません。 (推移比較不能性)
並べ替えアルゴリズムは安定していません。不安定な並べ替えは、areInIncreasingOrder が順序を確立しない要素の相対的な順序を変更する可能性があります。
以下の例では、クロージャは、HTTP 応答を記述するカスタム列挙の配列の順序を提供しています。predicate (述語) は、成功の前にエラーを順序付けし、エラーコードによってエラー応答を並べ替えます。
enum HTTPResponse { case ok case error(Int) } var responses: [HTTPResponse] = [.error(500), .ok, .ok, .error(404), .error(403)] responses.sort { switch ($0, $1) { // Order errors by code case let (.error(aCode), .error(bCode)): return aCode < bCode // All successes are equivalent, so none is before any other case (.ok, .ok): return false // Order errors before successes case (.error, .ok): return true case (.ok, .error): return false } } print(responses) // Prints "[.error(403), .error(404), .error(500), .ok, .ok]"
コレクションの要素を降順で並べ替えるには、大なり演算子 (>) を sort(by:) メソッドに渡して下さい。
students.sort(by: >)
print(students)
// Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
または、並べ替えを昇順ではなく降順にしたい場合は、このメソッドを使用して、Comparable に準拠する要素のコレクションを並べ替えます。 大なり演算子 (>) 演算子を predicate (述語) として渡します。
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students.sort(by: >)
print(students)
// Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"