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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1094閲覧

辞書ソート $0.0 < $1.0 が分からないです。

tanakashunta

総合スコア23

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2021/07/15 18:25

辞書のソートをする時

let sortData = dic.sorted { $0.0 < $1.0 } .map { $0 }

を使ったのですが

{ $0.0 < $1.0 }

の意味がわかりません。また

{ $0 < $1 }

でも同じ結果が出たのですがこの二つの違いはなんでしょうか
ご教示していただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

dic.sorted のリファレンス sorted(by:) の Declaration を見ると、

func sorted(by areInIncreasingOrder: ((key: Key, value: Value), (key: Key, value: Value)) throws -> Bool) rethrows -> [(key: Key, value: Value)]

となっており、dic.sorted に渡すクロージャの型は次のような関数になります。

swift

1((key: Key, value: Value), (key: Key, value: Value)) throws -> Bool
  • 引数が二つで、いずれも型は (key: Key, value: Value) という 名前付きタプル
  • 例外を投げることができる (クロージャが例外を投げると dic.sorted から rethrow されます)
  • 戻り値は Bool

例えば dic の中身が ["Kirishima": 2, "Kyoko": 1] の場合、このクロージャは

  • 一つ目の引数 $0 は名前付きタプル (key: "Kirishima", value: 2)
  • 二つ目の引数 $1 は名前付きタプル (key: "Kyoko", value: 1)

という引数で呼ばれます。そして名前付きタプルの場合、タプルの要素へのアプセスは名前でも連番でも可能なので、$0.0$1.0 は、タプルの最初の要素 ($0.key$1.key と同じ) となります。

つまり、$0.0 は "Kirishima"、$1.0 は "Kyoko" なので、$0.0 < $1.0 の結果は True になり、doc.sorted { $0.0 < $1.0 } の結果は次のようなタプルの配列になります。

swift

1let result: [(key: Key, value: Value)] = [ 2 (key: "Kirishima", value: 2), 3 (key: "Kyoko", value: 1) 4]

(ちなみに、doc.sorted { $0.1 < $1.1 } なら key ではなく value (つまり 2 と 1) を比較することになるので、この例だと順番が逆になります。)

また。doc.sorted { $0 < $1 } と書いた場合は、$0 や $1 はタプルなので、タプルの比較演算子 が使われます。この場合、まずタプルの最初の項目 (key) 同士を比較して、key が同じ場合には次の項目 (value) 同士を比較することになりますが、辞書の要素のため key が同じことはあり得ないので、doc.sorted { $0.0 < $1.0 } と同じ結果になります。


ところで、dic.sorted { 〜 } の後ろの .map { $0 } は、あってもなくも同じ結果になると思います。
($0 のところを $0.0$0.1 とすれば key または value だけを取り出すことができますが…。)

投稿2021/07/16 00:09

hoshi-takanori

総合スコア7901

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

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

hoshi-takanori

2021/07/16 00:28

なお、Key や Value はそれぞれ辞書のキーと値の型になります。例えば dic の型が [String: Int] なら、Key は String、Value は Int と読み替えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問