並び替えの条件を2つ指定したい場合、どう書いたらいいのか小一時間ほど悩んでしまいました。
Qiitaには同じような記事がないし、何より「こんな感じで書けばいいのか!!」と感動してしまったので共有させてください。
2つの条件でソートする.swift
import Foundation
// 体重と身長を保持する構造体
struct Person {
let seq: Int
let weight: Int
let height: Int
init(seq: Int, weight w: Int, height h: Int) {
self.seq = seq
self.weight = w
self.height = h
}
}
func sortTest() {
// テストデータの作成
// 人数
let N = 10
let w = [50, 42, 69, 80, 79, 81, 70, 53, 59, 50]
let h = [184, 170, 170, 169, 193, 154, 147, 180 ,170, 171]
let personDate = (0..<N).map {
Person(seq: $0, weight: w[$0], height: h[$0])
}
print("______________________ソート前")
_ = personDate.map {
print("識別番号\($0.seq), 身長: \($0.height), 体重:\($0.weight)")
}
// 第一条件: 身長の低い順
// 第二条件: 身長が同じであれば体重が軽い順に並び替える
let sortedPersonDate = personDate.sorted {
if $0.height == $1.height { return $0.weight < $1.weight }
else {
return $0.height < $1.height
}
}
print("______________________ソート後")
_ = sortedPersonDate.map {
print("識別番号\($0.seq), 身長: \($0.height), 体重:\($0.weight)")
}
}
______________________ソート前
識別番号0, 身長: 184, 体重:50
識別番号1, 身長: 170, 体重:42
識別番号2, 身長: 170, 体重:69
識別番号3, 身長: 169, 体重:80
識別番号4, 身長: 193, 体重:79
識別番号5, 身長: 154, 体重:81
識別番号6, 身長: 147, 体重:70
識別番号7, 身長: 180, 体重:53
識別番号8, 身長: 170, 体重:59
識別番号9, 身長: 171, 体重:50
______________________ソート後
識別番号6, 身長: 147, 体重:70
識別番号5, 身長: 154, 体重:81
識別番号3, 身長: 169, 体重:80
識別番号1, 身長: 170, 体重:42
識別番号8, 身長: 170, 体重:59
識別番号2, 身長: 170, 体重:69
識別番号9, 身長: 171, 体重:50
識別番号7, 身長: 180, 体重:53
識別番号0, 身長: 184, 体重:50
識別番号4, 身長: 193, 体重:79