Swift の Array(配列)- 要素の並べ替え

ここでは Swift の Array(配列)の要素を並べ替える方法についてご説明します。

sort() で Array(配列)の要素を並べ替える

Swift の Array(配列)の要素を並べ替えるには、sort() メソッドが使えます。

例えば、以下のような names という配列の要素をアルファベット順に並べるには、次のようにします。

var names = [ "Tanaka", "Suzuki", "Sato", "Yamada"]
print(names)

names.sort()
print(names)

実行結果は次のようになります。names 配列の要素の順番が、名前のアルファベット順にソートされています。

["Tanaka", "Suzuki", "Sato", "Yamada"]
["Sato", "Suzuki", "Tanaka", "Yamada"]

アルファベットの降順にしたい時は、sort(by: >) とすることで、先ほどの反対の順番になります。

var names = [ "Tanaka", "Suzuki", "Sato", "Yamada"]
print(names)

names.sort(by: >)
print(names)

実行結果は次のようになり、アルファベットの降順になっています。

["Tanaka", "Suzuki", "Sato", "Yamada"]
["Yamada", "Tanaka", "Suzuki", "Sato"]

sort() で 配列の構造体やクラスオブジェクトの要素を並べ替える

続いて sort() メソッドを使って、配列の要素が構造体オブジェクトの場合の並べ替えをしてみます。


次のような Student 構造体のオブジェクトが要素の students という配列があります。

struct Student {
    var name: String
    var age: Int
}

var students = [
    Student(name: "Tanaka", age: 10),
    Student(name: "Suzuki", age: 9),
    Student(name: "Sato", age: 8),
    Student(name: "Yamada", age: 10),
    Student(name: "Tanaka", age: 11)
]

for s in students {
    print("Name: \(s.name), Age: \(s.age)")
}
Name: Tanaka, Age: 10
Name: Suzuki, Age: 9
Name: Sato, Age: 8
Name: Yamada, Age: 10
Name: Tanaka, Age: 11

この配列を名前順にソートするには次のようにできます。

struct Student {
    var name: String
    var age: Int
}

var students = [
    Student(name: "Tanaka", age: 10),
    Student(name: "Suzuki", age: 9),
    Student(name: "Sato", age: 8),
    Student(name: "Yamada", age: 10),
    Student(name: "Tanaka", age: 11)
]

students.sort(by: {$0.name < $1.name})

for s in students {
    print("Name: \(s.name), Age: \(s.age)")
}

実行結果は次のようになり、要素が Student オブジェクトの name 順にソートされているのがわかります。

Name: Sato, Age: 8
Name: Suzuki, Age: 9
Name: Tanaka, Age: 10
Name: Tanaka, Age: 11
Name: Yamada, Age: 10

降順にしたい時は students.sort(by: {$0.name > $1.name}) のように不等号の向きを反対にするか、students.sort(by: {$1.name < $0.name}) のように $0 と $1 を入れ替えれば降順になります。


この配列を名前順に加えて、年齢の降順にソートしたい時には、やり方は何通りかありますが、タプルを使って次のようにすることができます。

struct Student {
    var name: String
    var age: Int
}

var students = [
    Student(name: "Tanaka", age: 10),
    Student(name: "Suzuki", age: 9),
    Student(name: "Sato", age: 8),
    Student(name: "Yamada", age: 10),
    Student(name: "Tanaka", age: 11)
]

students.sort(by: {
    ($0.name, $1.age) < ($1.name, $0.age)
})

for s in students {
    print("Name: \(s.name), Age: \(s.age)")
}

実行結果は次のようになり、要素が Student オブジェクトの name 昇順、age 降順にソートされました。

Name: Sato, Age: 8
Name: Suzuki, Age: 9
Name: Tanaka, Age: 11
Name: Tanaka, Age: 10
Name: Yamada, Age: 10

Swift の Array(配列)- 要素の並べ替え 1

sorted() で要素が並び替えられた Array(配列)を取得する

sort() メソッドを使うと、 Array(配列)内の要素の並び順を変更することができました。

その変更は永久的なもので、並べ替えてしまうと、元の並び順がどうだったかはもうわかりません。

時には、元の Array はそのままで、並び順が変わった Array を取得したいことがあるかもしれません。

そんな時は、sorted() メソッドを使うことで、要素が並び替えられた新しい Array を取得することができます。

vvar names = ["Tanaka", "Suzuki", "Sato", "Yamada"]

var names_sorted = names.sorted()
names_sorted[0] = "Saito1"

print(names)
print(names_sorted)

実行結果は次のようになり、names_sorted に要素が並べ替えられた Array がコピーされていて、names_sorted を変更しても、names には影響を与えていませんね。

["Tanaka", "Suzuki", "Sato", "Yamada"]
["Saito1", "Suzuki", "Tanaka", "Yamada"]

reverse() メソッドで要素の並び順を反対にする

Swift の Array(配列)の要素の並び順を単純に今の反対にしたい時は reverse() メソッドを使います。

var names = ["Tanaka", "Suzuki", "Sato", "Yamada"]
print(names)

names.reverse()
print(names)

実行結果は次のようになり、要素の順番が反対になっていますね。

["Tanaka", "Suzuki", "Sato", "Yamada"]
["Yamada", "Sato", "Suzuki", "Tanaka"]

sort() と sorted() のように reverse() にも reversed() があり、並び順を逆にした配列をコピーしたい時は reversed() が使えます。


以上、Swift の Array(配列)の要素を並べ替える方法についてご説明しました。

© 2024 iOS 開発入門