Golangでmapをソートする。 [プログラミング]
タイトル通りのことはできません。結局、mapを構造体に入れ込んでそれでソートして使わないといけないみたい。そもそもmapを順に出力しようとすると、ランダムで出てきてしまうらしい。基本的にmapをそのまま使っていたらソートできないようだ。なので構造体に入れずともスライスに入れてソートしないことにはどうにもならない。
どうしてそんな仕様になっているのかというと、固定してしまうと環境によって実行順序が違ってしまい、移植性が悪くなるからわざわざランダムにしているらしい。ランダムにしているからrangeでループさせる時に定まっていない。なんかめんどくさぁ。
https://zenn.dev/sinozu/articles/c02cecbab039795d071a
ここに書かれているように、keyでソートするならそれほど面倒でもないんだけど、valueでソートするとなると少し面倒。というか、value側でソートする方が多いと思うんだがどうだろうか。
Golanger(一般的にGo使いのことをなんていうんだ?)にとっては、mapがそのままではソートできないランダム出力仕様になっていることは当たり前なのか、mapをソートするところにはそのことが書いてあることが少ないみたいだ。なんでそのことを説明しないのかわからないが、ソースが得られればそれでいい人が大多数なんだろうな。
これ↓でいいんだろうけど、いまいち分かりづらいし、位置関係を維持している状態がいまいち掴みづらい。
https://code-maven.com/slides/golang/sort-map-by-value
やっていることはおんなじなんだけど、構造体で順序が維持されるので、こっちの方がいいかなと思う。ただ構造体に入れ直さないといけないのでちょっと面倒。まぁrangeで回して入れるだけなので、インプリ的にも処理的にもそこまで重くはないとは思うのだが。
https://qiita.com/Sekky0905/items/2d5ccd6d076106e9d21c
さらに面倒なことをしようとすると、Len(), Swap(), Less()を実装するとできるらしい。Golangに用意されているお作法的にはそういうふうにした方がいいんだろうけど、正直内部で何やっているのかが分かりづらい。
https://ashitani.jp/golangtips/tips_map.html#map_Sort
普通にググったらここが一番最初に出てきて、どっちのパターンも出てくるんだよね。英語なのと会社でstackoverflow遮断されているので見ていなかった。
https://stackoverflow.com/questions/18695346/how-can-i-sort-a-mapstringint-by-its-values
よく考えたら
の時に無名関数でLess()関数を定義しているのでやっていることは同じなのかもしれない。
書き方は分かるんだけども、やっぱり中で何やってんだかわからない。ソースを読むべきかなぁ。型に属する関数の書き方とかよく分かってないだけなんだろうけど、訳わかってないけどそう書くと動くみたいなのはなるべく無くしたい気はする。
Less関数で条件を指定している。それは分かる。内部でどう組み込んでいるのかが直接見ていないのでよくわかっていない。ソースを見れば分かるのだろうか。そのうち詳しく見ていくかもしれない。
どうしてそんな仕様になっているのかというと、固定してしまうと環境によって実行順序が違ってしまい、移植性が悪くなるからわざわざランダムにしているらしい。ランダムにしているからrangeでループさせる時に定まっていない。なんかめんどくさぁ。
https://zenn.dev/sinozu/articles/c02cecbab039795d071a
ここに書かれているように、keyでソートするならそれほど面倒でもないんだけど、valueでソートするとなると少し面倒。というか、value側でソートする方が多いと思うんだがどうだろうか。
Golanger(一般的にGo使いのことをなんていうんだ?)にとっては、mapがそのままではソートできないランダム出力仕様になっていることは当たり前なのか、mapをソートするところにはそのことが書いてあることが少ないみたいだ。なんでそのことを説明しないのかわからないが、ソースが得られればそれでいい人が大多数なんだろうな。
これ↓でいいんだろうけど、いまいち分かりづらいし、位置関係を維持している状態がいまいち掴みづらい。
https://code-maven.com/slides/golang/sort-map-by-value
やっていることはおんなじなんだけど、構造体で順序が維持されるので、こっちの方がいいかなと思う。ただ構造体に入れ直さないといけないのでちょっと面倒。まぁrangeで回して入れるだけなので、インプリ的にも処理的にもそこまで重くはないとは思うのだが。
https://qiita.com/Sekky0905/items/2d5ccd6d076106e9d21c
さらに面倒なことをしようとすると、Len(), Swap(), Less()を実装するとできるらしい。Golangに用意されているお作法的にはそういうふうにした方がいいんだろうけど、正直内部で何やっているのかが分かりづらい。
https://ashitani.jp/golangtips/tips_map.html#map_Sort
普通にググったらここが一番最初に出てきて、どっちのパターンも出てくるんだよね。英語なのと会社でstackoverflow遮断されているので見ていなかった。
https://stackoverflow.com/questions/18695346/how-can-i-sort-a-mapstringint-by-its-values
よく考えたら
sort.Slice(スライス, func(i, j int) bool {
の時に無名関数でLess()関数を定義しているのでやっていることは同じなのかもしれない。
書き方は分かるんだけども、やっぱり中で何やってんだかわからない。ソースを読むべきかなぁ。型に属する関数の書き方とかよく分かってないだけなんだろうけど、訳わかってないけどそう書くと動くみたいなのはなるべく無くしたい気はする。
Less関数で条件を指定している。それは分かる。内部でどう組み込んでいるのかが直接見ていないのでよくわかっていない。ソースを見れば分かるのだろうか。そのうち詳しく見ていくかもしれない。
タグ:Golang
コメント 0