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
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(配列)の要素を並べ替える方法についてご説明しました。