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

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

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

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

Q&A

解決済

4回答

801閲覧

配列内の配列に特定の文字が一致した場合の最大値の求め方

kzd847686

総合スコア53

Ruby

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

0グッド

0クリップ

投稿2018/10/03 08:21

配列内の配列に特定の文字が一致した場合の最大値の求め方を教えて頂きたいです。

具体的には、次のような配列があるときに、配列内の配列の一つ目がbig、かつ二つ目がredの時の最大の3つ目を求めたいです。

array = [[big,blue,95],[small,red,80],[big,red,85],[small,red,90],[big,red,75]]

この場合、
配列内の配列の1つ目がbigは次の3つ
[big,blue,95]  [big,red,85]  [big,red,75]

上の3つの中で配列内の配列の2つ目がredは次の2つ
[big,red,85]  [big,red,75]

上の2つの中で配列内の配列の3つ目が最大なのは
85

この”85”をプログラムで出したいです。

考え方やサンプルコードを教えて頂けると助かります。
宜しくお願いします。

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

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

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

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

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

dice142

2018/10/03 08:49

間違ってても構わないのでご自身の考え方やご自身で書いたコードの提示をお願いしたいです。
kzd847686

2018/10/03 09:31

質問の前に自分で考えた方法は、array.select{|n|[0] == "big" and |n|[1] == "red"}.max でしたが上手くいきませんでした…
dice142

2018/10/03 09:35

その考えた方法を質問文に追記してください。他の回答者の方が回答する参考になります。
dice142

2018/10/03 09:36

「うまくいかない」のはエラーが有るのか出力が異なるのか詳細にお願いします。
guest

回答4

0

ruby

1array = [[big,blue,95],[small,red,80],[big,red,85],[small,red,90],[big,red,75]] 2 3array.select {|x| x[0] == :big && x[1] == :red}.map{|x| x[2]}.max

select で [:big, :red, *] だけを抜き出します。
map で 3 番目の整数だけを抜き出します。
max で最大値を抜き出します。

投稿2018/10/03 14:53

katoy

総合スコア22324

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

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

kzd847686

2018/10/04 13:23

ありがとうございます。解説のおかげで次回からは自分でできそうです!
guest

0

この場合、
配列内の配列の1つ目がbigは次の3つ
[big,blue,95]  [big,red,85]  [big,red,75]

上の3つの中で配列内の配列の2つ目がredは次の2つ
[big,red,85]  [big,red,75]

上の2つの中で配列内の配列の3つ目が最大なのは
85

そのままコードにすりゃいいのでは?

rb

1big = "big" 2blue = "blue" 3red = "red" 4small = "small" 5 6array = [[big,blue,95],[small,red,80],[big,red,85],[small,red,90],[big,red,75]] 7 8p array.select{|x,y,z| x == "big" && y == "red"}.max_by(&:last).last

投稿2018/10/03 09:27

asm

総合スコア15147

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

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

mather

2018/10/03 10:45

せっかく変数化しているのであれば x == big && y == red でいいですね。
guest

0

複雑な処理をする場合の考え方ですが、まずは

[[big, 95], [small, 80], [big, 85], [small, 90], [big, 75]]

のような簡単な例で同じことをしてみてはいかがでしょうか?

投稿2018/10/03 08:41

dice142

総合スコア5158

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

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

0

ベストアンサー

もっとスマートな書き方があるかもしれないですが...

ruby

1array = [['big', 'blue', 95], ['small', 'red', 80], ['big', 'red', 85], ['small', 'red', 90], ['big', 'red', 75]] 2nums = [] 3array.each do |size, color, value| 4 if size.match?('big') && color.match?('red') 5 nums << value 6 end 7end 8p nums.max 9#=> 85

追記:

ruby

1array.map{|a, b, c| c if a=='big' && b=='red'}.compact.max

これで同じ結果が取得できました。

投稿2018/10/03 08:41

編集2018/10/04 00:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dice142

2018/10/03 08:55

最大値だけ求めるならnumsに格納せずmax値だけ更新すれば良い気がします。
kzd847686

2018/10/04 13:22

ありがとうございます。できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問