SwiftのDictionaryをkeyでソートする方法
こんにちは、@Yuuです。
SwiftのDictionaryをkeyでソートする方法を紹介します。
ただ、今回紹介する方法よりもっといい方法があるんじゃないか?と思ってるので、もっとやりやすい方法をご存知の方はぜひ教えて下さい!
スポンサーリンク
やりたいこと
1 2 3 4 5 6 |
var dict : [String : String] = [ "a":"aのvalue", "d":"dのvalue", "c":"cのvalue", "b":"bのvalue" ] |
上のような変数dictがあった場合に
1 2 3 4 |
key:aの時、value:aのvalue key:bの時、value:bのvalue key:cの時、value:cのvalue key:dの時、value:dのvalue |
上記のように表示したい。
というのが今回のやりたいことです。
ちなみにSwiftでDictionaryをfor文で回す場合、以下のように記述するかと思いますが、
1 2 3 |
for (key, value) in dict { println("keyは(key) valueは(value)") } |
上記のように記述した場合、以下のように表示されます。
1 2 3 4 |
keyはb valueはbのvalue keyはa valueはaのvalue keyはd valueはdのvalue keyはc valueはcのvalue |
keyを「"a","d","c","b"」の順番で設定したつもりなのに、
表示される順番がバラバラですね・・。
これはどうやらDictionaryをfor文で回した際は、
順番は保障してくれないそうで、格納した順番を気にする場合は、格納した順番を守ってくれる配列を使った方がいいそうです。
うーむ、ややこしい・・(; ・`д・´)
Dictionaryをkeyでソートして出力する
じゃあ、Dictonaryをソートして表示するにはどうしたらええねん!?
という話ですよね。
結論から言ってしまうと、まずDictionaryのkeyだけを取り出し配列を作り、その配列を回しDictionaryと比較するという事をやります。
うん、言葉だけだと良く分からないですね。
良く分からないと思うので、実際にやってみましょう!
keyだけでArrayを作り、ソートする
使用するDictionary型の変数は、最初に提示したvar dict : [String : String]
を使用します。
まずkeyだけを取り出して新たな配列を作り、更にその配列をソートします。
1 2 3 4 |
// 変数keysにdictのkeyのみを取り出す var keys : Array = Array(dict.keys) // keysを昇順でソートする sort(&keys){$0 < $1} |
4行目はソートを行っています。
初めて見た時は「随分独特な書き方をするなぁ」と思ったのですが、他にもこのように書く言語があるんですかね?
とりあえず、ちゃんとソートされているか出力してみましょう。
1 2 3 |
for sortKey in keys { println("sortKeyは(sortKey)") } |
1 2 3 4 |
sortKeyはa sortKeyはb sortKeyはc sortKeyはd |
無事ソート出来ていますね。
ちなみに
先程の4行目のソート方法は昇順で行っていますが、降順で行う場合は
1 |
sort(&keys){$0 > $1} |
のように書けばOKです(๑•̀ㅂ•́)و✧
ソートしたkeyをfor文で回し、dictを入れ子で回して結果を出力する
Dictonaryだとfor文の出力順番が保障されないですが、
配列であれば大丈夫!
なので、ソートを行ったkeysをfor文で回し、そのkeyの値と同じkeyの値を持つdictのvalueを表示すれば、ソートが行えているはず・・!
百聞は一見にしかず、ということで文章でごちゃごちゃ書くより、やったものをお見せした方が分かりやすいですね。
1 2 3 4 5 6 7 |
for sortKey in keys { for (key, value) in dict { if sortKey == key { println("keyは(key) valueは(value)") } } } |
1 2 3 4 |
keyはa valueはaのvalue keyはb valueはbのvalue keyはc valueはcのvalue keyはd valueはdのvalue |
ちゃんとソートが行えていますね!
(๑•̀ㅂ•́)و✧
一応、今回の処理全文を記載しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var dict : [String : String] = [ "a":"aのvalue", "d":"dのvalue", "c":"cのvalue", "b":"bのvalue" ] // 変数keysにdictのkeyのみを取り出す var keys : Array = Array(dict.keys) // keysをソートする sort(&keys){$0 < $1} for sortKey in keys { for (key, value) in dict { if sortKey == key { println("keyは(key) valueは(value)") } } } |
あとがき
Swiftだとソートの書き方が独特だなぁ、と思いました。
あと、Dictonaryだと何故for文の順番がおかしくなってしまうんでしょう?
Dictonaryの状態でも一発でソートが出来て、for文で回した際にも順番が保障されればいいのに・・
ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧