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

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

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

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

Q&A

解決済

2回答

5280閲覧

最大値を求める際、最大値が2つ存在した場合両方を抽出したい

yuki_90453

総合スコア326

Ruby

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

0グッド

0クリップ

投稿2017/01/23 23:59

下記のようなハッシュがあり、値の最大値を取得しそれに対応するkeyを抽出したいと考えております。
hash.max{|a,b|a[1] <=> b[1]}では値は1つしか取得出来ません。

ruby

1{"友人のために購入し、大変気に入ってもらえました"=>0.5, "スマートなデザイン"=>1.0, "タブレットをしっかり保護してくれます"=>1.0, "とても便利です"=>1.0, "値段が高い"=>-1.0}

そこで下記のように条件分岐で値が同じ場合、2つの値を返す風に記述してみたのですが、これでは比較する機能が出来なくなってしまうと思います。

ruby

1 val = negapoji_hash.max{|a,b| 2 unless a[1] == b[1] 3 a[1] <=> b[1] 4 else 5 return a[1],b[1] 6 end 7 } 8

複数の最大値を取得するにはどうすればよいでしょうか?

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

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

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

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

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

guest

回答2

0

次の irb での 2 つの操作をみてください。

ruby

1$ irb 2irb(main):001:0> h = {"友人のために購入し、大変気に入ってもらえました"=>0.5, "スマートなデザイン"=>1.0, "タブレットをしっかり保護してくれます"=>1.0, "と ても便利です"=>1.0, "値段が高い"=>-1.0} 3=> {"友人のために購入し、大変気に入ってもらえました"=>0.5, "スマートなデザイン"=>1.0, "タブレットをしっかり保護してくれます"=>1.0, "とても便利です"=>1.0, "値段が高い"=>-1.0} 4 5irb(main):002:0> max_v = h.values.max 6=> 1.0 7 8irb(main):003:0> bests = h.select{|k,v| v == max_v} 9=> {"スマートなデザイン"=>1.0, "タブレットをしっかり保護してくれます"=>1.0, "とても便利です"=>1.0} 10 11irb(main):004:0> bests.keys 12=> ["スマートなデザイン", "タブレットをしっかり保護してくれます", "とても便利です"]

ruby

1irb(main):027:0> bests = h.group_by{|k,v| v} 2=> {0.5=>[["友人のために購入し、大変気に入ってもらえました", 0.5]], 1.0=>[["スマートなデザイン", 1.0], ["タブレットをしっかり保護してくれます", 1.0], ["とても便利です", 1.0]], -1.0=>[["値段が高い", -1.0]]} 3 4irb(main):028:0> bests = h.group_by{|k,v| v}.max 5=> [1.0, [["スマートなデザイン", 1.0], ["タブレットをしっかり保護してくれます", 1.0], ["とても便利です", 1.0]]] 6 7irb(main):029:0> bests = h.group_by{|k,v| v}.max[1] 8=> [["スマートなデザイン", 1.0], ["タブレットをしっかり保護してくれます", 1.0], ["とても便利です", 1.0]] 9 10irb(main):030:0> bests = h.group_by{|k,v| v}.max[1].to_h 11=> {"スマートなデザイン"=>1.0, "タブレットをしっかり保護してくれます"=>1.0, "とても便利です"=>1.0} 12 13irb(main):031:0> bests = h.group_by{|k,v| v}.max[1].to_h.keys 14=> ["スマートなデザイン", "タブレットをしっかり保護してくれます", "とても便利です"]

1番目の方法: values の max を求る。 hash からその値のものを取り出す。

2番目の方法: value で分類して max を求める。

投稿2017/01/27 23:39

katoy

総合スコア22324

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

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

0

ベストアンサー

まず値の最大値(例の場合なら1.0)を求め、次に値がそれと等しくなるキーを求めるという二段階でどうでしょうか?

投稿2017/01/24 00:31

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問