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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

815閲覧

辞書の入った配列で辞書のキーAの値で抜き出してキーBの値でソートしたい。

data7600

総合スコア18

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/05 04:53

swift

1var dicArray:[[String:Any]] = [["name":"田中","age":45,"height":167], 2 ["name":"佐藤","age":44,"height":180], 3 ["name":"鈴木","age":44,"height":177], 4 ["name":"高橋","age":45,"height":169], 5 ["name":"黒田","age":44,"height":172], 6 ["name":"山本","age":44,"height":179]]

このような配列を用意して、この中からageが44の辞書を取り出してheightの順で並べ替えて下記のようしたいです。

swift

1var dicArray:[[String:Any]] = [["name":"黒田","age":44,"height":172], 2 ["name":"鈴木","age":44,"height":177], 3 ["name":"山本","age":44,"height":179], 4 ["name":"佐藤","age":44,"height":180]]

抜き出しは下記のような感じで考えたのですが、

swift

1var dicArrayB:[[String:Any]] = [[:]] 2 3for i in 0...dicArray.count - 1 { 4 let dic = dicArray[i] 5 6 if dic["age"] as! Int == 44 { 7 dicArrayB.append(dic) 8 } 9}

並べ替えの方法がわかりません。
よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

filtersorted を使って、配列から要素の抽出とソートをおこなうことができます。

let dicArray: [[String:Any]] = [ ["name":"田中","age":45,"height":167], ["name":"佐藤","age":44,"height":180], ["name":"鈴木","age":44,"height":177], ["name":"高橋","age":45,"height":169], ["name":"黒田","age":44,"height":172], ["name":"山本","age":44,"height":179] ] let result = dicArray.filter { (e) -> Bool in return (e["age"] as! Int) == 44 }.sorted { (x, y) -> Bool in return (x["height"] as! Int) < (y["height"] as! Int) }

下記のような結果を得ることができます。

[ ["name": "黒田", "height": 172, "age": 44], ["name": "鈴木", "height": 177, "age": 44], ["age": 44, "name": "山本", "height": 179], ["height": 180, "name": "佐藤", "age": 44] ]

また、辞書の内容がある程度決まっているようでしたら、型を使ってよりシンプルに記述することができます。

struct User { let name: String let age: Int let height: Int }
let dicArray: [User] = [ User(name: "田中", age: 45, height: 167), User(name: "佐藤", age: 44, height: 180), User(name: "鈴木", age: 44, height: 177), User(name: "高橋", age: 45, height: 169), User(name: "黒田", age: 44, height: 172), User(name: "山本", age: 44, height: 179) ] let result = dicArray.filter({ $0.age == 44 }).sorted(by: { $0.height < $1.height }) print("(result)")

検証環境について

  • Xcode 11.4
  • iOS 13.4

にて検証をおこないました。

投稿2020/04/05 05:27

ch3cooh

総合スコア287

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

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

data7600

2020/04/05 05:34

ありがとうございます。 知らないやり方がいっぱいありますね。 structもまだ理解ができず手が出ません。 とりあえずこれで頑張ってみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問