質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

939閲覧

配列を並び替える書き方をシンプルに書くにはどうしたらいいですか?

mskRR

総合スコア6

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/09/26 07:28

編集2020/09/27 07:56

コード中のPerson配列からキーを指定して並び替えをされた状態の配列を取得したいのですが、シンプルな記述方法がわかりません。簡単に書く方法はありませんか?
この書き方だとキーとなる要素が増えるとswitch文のcaseが増えていってしまいます。

swift

1enum BloodType: Comparable { 2 case A 3 case B 4 case O 5 case AB 6} 7 8enum Sex: Comparable { 9 case mele 10 case female 11} 12 13enum SortKey { 14 case sex 15 case bloodType 16 case height 17 case weight 18} 19 20enum SortOrder { 21 case ascending 22 case descending 23} 24 25class Person { 26 27 let name: String 28 let sex: Sex 29 let bloodType: BloodType 30 var height: Int 31 var weight: Int 32 33 init(name: String, sex: Sex, bloodType: BloodType, height: Int, weight: Int) { 34 self.name = name 35 self.sex = sex 36 self.bloodType = bloodType 37 self.height = height 38 self.weight = weight 39 } 40 41} 42 43class Persons { 44 45 var groupName: String 46 var persons: [Person] = [] 47 48 init(groupName: String) { 49 self.groupName = groupName 50 } 51 52 53 // この部分で並び替えられた配列を取得したいのですが、簡潔な書き方はありませんか? 54 func filterdPersons(sortKey: SortKey, sortOrder: SortOrder) -> [Person] { 55 56 switch (sortKey, sortOrder) { 57 case (.sex, .ascending): 58 return persons.sorted (by: { $0.sex < $1.sex }) 59 case (.sex, .descending): 60 return persons.sorted (by: { $0.sex > $1.sex }) 61 case (.bloodType, .ascending): 62 return persons.sorted (by: { $0.bloodType < $1.bloodType }) 63 case (.bloodType, .descending): 64 return persons.sorted (by: { $0.bloodType > $1.bloodType }) 65 case (.height, .ascending): 66 return persons.sorted (by: { $0.height < $1.height }) 67 case (.height, .descending): 68 return persons.sorted (by: { $0.height > $1.height }) 69 case (.weight, .ascending): 70 return persons.sorted (by: { $0.weight < $1.weight }) 71 case (.weight, .descending): 72 return persons.sorted (by: { $0.weight > $1.weight }) 73 } 74 } 75 76}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

それで問題ないと思うけど、どうしてもというならN×2の条件分岐をNと2に分けるぐらいですかね?

swift

1 func filterdPersons(sortKey: sortKey, sortOrder: sortOrder) -> [Person] { 2 3 switch sortKey { 4 case .sex: 5 return persons.sorted { comparator(sortOrder)($0.sex, $1.sex) } 6 case .bloodType: 7 return persons.sorted { comparator(sortOrder)($0.bloodType, $1.bloodType) } 8 case .height: 9 return persons.sorted { comparator(sortOrder)($0.height, $1.height) } 10 case .weight: 11 return persons.sorted { comparator(sortOrder)($0.weight, $1.weight) } 12 } 13 } 14 15 private func comparator<T: Comparable>(_ sortOrder: sortOrder) -> (T, T) -> Bool { 16 17 switch sortOrder { 18 case .ascending: return { $0 < $1 } 19 case .descending: return { $0 > $1 } 20 } 21 }

質問とは無関係だけど、Swiftでは型名は大文字から始めましょう。

投稿2020/09/27 04:30

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mskRR

2020/09/27 07:56

ありがとうございます。真似してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問