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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

3回答

1949閲覧

Rubyのリファクタリング方法について

GOROGORO

総合スコア66

Ruby

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/12/22 09:21

こんにちは。

Ruby2,Rails4の環境でアプリケーションを開発しています。
リファクタリングについて質問させてください。
以下のようなコードがあり、配列で渡された値の中で
一番大きい値と二番目に大きい値か、
一番小さい値と二番目に小さい値か
のどちらかを取得したいです。
どちらかちいうのはフラグで判断します。

以下のコードでも動くのですが、冗長な部分が多くもっときれいに書けるとは思うのですが、どのように書けばよく分からず。。。

良い案あるかたお教えいただけないでしょうか?

ruby

1 #一番目に大きい値と、二番目に大きい値の配列を取得する。 2 for i in -25..-1 do 3 if upper_flag==1 4 if first_param[1] < sharping_befor_param[i][1] 5 second_param=first_param 6 first_param=sharping_befor_param[i] 7 elsif second_param[1] < sharping_befor_param[i][1] 8 second_param=sharping_befor_param[i] 9 end 10 #一番目に小さい値と、二番目に小さい値の配列を取得する。 11 else 12 if first_param[1] > sharping_befor_param[i][1] 13 second_param=first_param 14 first_param=sharping_befor_param[i] 15 elsif second_param[1] > sharping_befor_param[i][1] 16 second_param=sharping_befor_param[i] 17 end 18 end 19 end

以上よろしくお願いします。

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

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

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

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

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

guest

回答3

0

既にでている回答を参考に、次のコードをかいてみました。

ruby

1def sored_take_n(ary, n = 1, order = :asc) 2 sorted = 3 case order 4 when :asc 5 ary.sort 6 when :desc 7 ary.sort.reverse! 8 else 9 fail ArgumentError.new("order = #{order}") 10 end 11 12 sorted.take(n) 13end 14 15ary = [10, 9, 1, 2, 5, 4, 3] 16p ary.sort 17 18p sored_take_n(ary, 2) 19p sored_take_n(ary, 2, :desc) 20 21p sored_take_n([0], 2) 22p sored_take_n([], 2) 23 24p sored_take_n(ary, 2, :xxx)

実行結果:

$ ruby ccc.rb [1, 2, 3, 4, 5, 9, 10] [1, 2] [10, 9] [0] [] ccc.rb:9:in `sored_take_n': order = xxx (ArgumentError) from ccc.rb:24:in `<main>'

投稿2015/12/27 10:57

katoy

総合スコア22324

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

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

0

rubyよく知らないんですけど
こんな感じでどうでしょう。

ruby

1def take2(arr,assending) 2 if(assending) 3 return arr.sort.take(2) 4 else 5 return arr.sort {|a, b| b <=> a }.take(2) 6 end 7end 8 9arr=[7,8,9,1,2,3,4,5,6] 10 11puts take2(arr,true) 12puts take2(arr,false)

take2という名前はとりあえずでつけたんで
もっと実体を表したいい名前つけて下さい。
「2個」というのもパラメータ化していいと思います。

投稿2015/12/22 09:48

ozwk

総合スコア13521

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

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

0

ベストアンサー

その仕様で書き直すとこんな感じでしょうか。要素が数十個、数百個なら全体をソートするのが簡単です。
数百万個あるなら、お書きのようなループでしょうね。

Ruby

1first_param, second_param = 2if upper_flag==1 3 sharping_befor_param.sort_by{|x| -x[1]} 4else 5 sharping_befor_param.sort_by{|x| x[1]} 6end

なお、フラグに数値を使うのは良くないです。二値なら、true/false を使いましょう。

投稿2015/12/22 11:34

otn

総合スコア84499

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問