LoginSignup
4
6

More than 3 years have passed since last update.

Swiftでソート条件を複数指定する

Last updated at Posted at 2020-11-06

並び替えの条件を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
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6