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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

468閲覧

Ruby 配列の中のハッシュをvalueによって並び替える

1SozEri4TqBCkFD

総合スコア9

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/10/21 09:28

配列の中のハッシュを並び替えたいのですが、やり方が分からないので質問致します。

例えば

Ruby

1array = [ {1=>4}, {2=>6}, {3=>5} ]

という配列があったとします。
これを

Ruby

1[ {2=>6}, {3=>5}, {1=>4} ]

のように並び替える方法はあるのでしょうか?

ご教授お願いします。

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

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

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

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

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

maisumakun

2020/10/21 09:51 編集

何を基準に並べ替えるのでしょうか? ・ハッシュの値の逆順にする ・1番目を最後に持ってくる ・その他
1SozEri4TqBCkFD

2020/10/21 09:52 編集

失礼いたしました ハッシュの値により降順に並び替えたいです
guest

回答3

0

ベストアンサー

Ruby

1array.sort_by!{|h| -h.values.first}

ですね。

「要素が1つしか無いハッシュの値の方」を一発で取り出す手段はないので、values.firstくらい。
降順なので-を付けます。

投稿2020/10/21 14:51

otn

総合スコア84796

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

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

tatsu99

2020/10/22 00:49

ご指摘ありがとうございます。 こちらの方が良いですね。
1SozEri4TqBCkFD

2020/10/22 03:25

こちらのコードを参考にさせて頂きます! お二方ありがとうございました!
guest

0

前回回答者です。
ちょっと強引ですが、以下でどうでしょうか。
array.sort!{|h1,h2| h2.flatten[1].to_i <=> h1.flatten[1].to_i}

irbの確認結果です。
irb(main):001:0> array = [ {1=>4}, {2=>6}, {3=>5} ]
irb(main):002:0> array.sort!{|h1,h2| h2.flatten[1].to_i <=> h1.flatten[1].to_i}
=> [{2=>6}, {3=>5}, {1=>4}]
irb(main):003:0> p array
[{2=>6}, {3=>5}, {1=>4}]
=> [{2=>6}, {3=>5}, {1=>4}]

ruby バージョンです。
[LINUX75 107] % ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]

投稿2020/10/21 13:14

tatsu99

総合スコア5470

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

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

1SozEri4TqBCkFD

2020/10/21 13:31

こちらの通りに実行したところ、上手くいきました! 平坦化する必要があったんですね! 大変ご丁寧にありがとうございました!!
guest

0

array.sort!{|(k1,v1),(k2,v2)| v2<=>v1}
でどうでしょうか。

以下のスクリプトで確認しました。

Ruby

1array = [ {1=>4}, {2=>6}, {3=>5} ] 2p array 3array.sort!{|(k1,v1),(k2,v2)| v2<=>v1} 4p array 5

実行結果
[{1=>4}, {2=>6}, {3=>5}]
[{2=>6}, {3=>5}, {1=>4}]

投稿2020/10/21 11:28

編集2020/10/21 11:51
tatsu99

総合スコア5470

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

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

1SozEri4TqBCkFD

2020/10/21 11:40

ご回答ありがとうございます。 今試してみたところ、 arrayがそのまま出てきました
tatsu99

2020/10/21 11:43

array.sortでなくて array.sort! です。!がついてますか?
1SozEri4TqBCkFD

2020/10/21 11:47

はい、おっしゃる通りに!をつけて実行しています!
tatsu99

2020/10/21 11:52

スクリプトを追記しましたので、それをコピペして確認していただけますでしょうか。
1SozEri4TqBCkFD

2020/10/21 11:55

ありがとうございます rails consoleでこちらを実行しました irb(main):007:0> array = [ {1=>4}, {2=>6}, {3=>5} ] => [{1=>4}, {2=>6}, {3=>5}] irb(main):008:0> p array [{1=>4}, {2=>6}, {3=>5}] => [{1=>4}, {2=>6}, {3=>5}] irb(main):009:0> array.sort!{|(k1,v1),(k2,v2)| v2<=>v1} => [{1=>4}, {2=>6}, {3=>5}] irb(main):010:0> p array [{1=>4}, {2=>6}, {3=>5}] => [{1=>4}, {2=>6}, {3=>5}] 何が原因なのでしょうか?
tatsu99

2020/10/21 12:07 編集

irb(main):001:0> array = [ {1=>4}, {2=>6}, {3=>5} ] => [{1=>4}, {2=>6}, {3=>5}] irb(main):002:0> p array [{1=>4}, {2=>6}, {3=>5}] => [{1=>4}, {2=>6}, {3=>5}] irb(main):003:0> array.sort!{|(k1,v1),(k2,v2)| v2<=>v1} => [{2=>6}, {3=>5}, {1=>4}] irb(main):004:0> p array [{2=>6}, {3=>5}, {1=>4}] => [{2=>6}, {3=>5}, {1=>4}] irb(main):005:0> こちらでの確認結果です。期待通りの結果です。 こちらのrubyのバージョンです。windows7で確認しています。 D:\goo\ruby>ruby -v ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32] あなたの環境を教えてください。
1SozEri4TqBCkFD

2020/10/21 12:16

原因はよく分かりませんが、ご回答いただきありがとうございました!
tatsu99

2020/10/21 12:19

念のため教えてください。なにか、わかるかも知れません。 rubyのバージョンはどうなっていますか。 OSはwindowsですかlinuxですか。
tatsu99

2020/10/21 12:38

ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]で確認しました。 あなたと同様の現象が発生しました。2.7だとこの方法はできないようですね。 回答は取り下げます。もう少し調べてみますが、ほかの識者の回答を待ってください。
1SozEri4TqBCkFD

2020/10/21 13:28

ご丁寧にありがとうございます! Rubyのバージョンはこちらになります。 ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-darwin19] OSはmacOS Catalinaです。
otn

2020/10/21 14:45

> {|(k1,v1),(k2,v2)| v2<=>v1} これは、k1 k2 にハッシュが入って、v1 v2はnilになります。
tatsu99

2020/10/22 00:56

array.sort!{|(k1,v1),(k2,v2)| v2<=>v1} これで、windows版は動作しますが、それは、windows版のバグのようですね。 >これは、k1 k2 にハッシュが入って、v1 v2はnilになります。 これが、正規の仕様なので、array.sort!{|(k1,v1),(k2,v2)| v2<=>v1}の結果はなにもかわらない ということですね。ご指摘ありがとうございました。
otn

2020/10/22 10:00

ruby -v -e "p([1,2,3].sort{0})" ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32] (Rubyinstaller) [2, 3, 1] ruby -v -e "p([1,2,3].sort{0})" ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] (ソースからビルド) [1, 2, 3] と、結果は違うのですが、バグでは無いようです。Array#sort のリファレンスには記述が無いのですが、Enumerable#sort のリファレンスには記述があります。 > Enumerable#sort は安定ではありません (unstable sort)。 Cのライブラリのソート機能を使っていて、その差と言うことなのでしょうかね。
tatsu99

2020/10/22 11:18

念のためwindows版で array.sort!{|(k1,v1),(k2,v2)| v2<=>v1}を array.sort!{|(k1,v1),(k2,v2)| v1<=>v2}のケース array.sort!{|(k1,v1),(k2,v2)| nil<=>nil}のケース で試してみました。 結果は全て同じで、[{2=>6}, {3=>5}, {1=>4}]でした。 不安定ソートなら、sortの比較時にnil,nilで同じ値で比較しているので、どのような結果になっても(バグではなく)仕様通りである、ということになりますね。 そもそも、比較のとき、nilを渡してること自体が問題なので、「私のソースが誤りだった」という結論で 閉じたいと思います。不安定ソートについてのご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問