11

次の配列があるとしましょう。

arr = [[5, 1], [2, 7]]

そして、要素の2番目の要素を比較して、最小の要素を見つけたいと思います。が。未満である[5, 1]ため、最小要素はになります。次のコードを使用できます。17

arr.min {|a,b| a[1] <=> b[1]}

最大値を計算するために、私は同じことをすることができます:

arr.max {|a,b| a[1] <=> b[1]}

それは与える[2, 7]

私はいつも同じブロックを使用しています。そのブロックをどこかに置き、min/max関数に提供したいと思います。私は次のようなものを望んでいました:

blo = lambda {|a,b| a[1] <=> b[1]}
arr.min blo

動作しますが、動作しませんでした。私がこれをどのように行うことができるかについてのアイデアはありますか?

4

5 に答える 5

24

&演算子を使用して、Procオブジェクトをブロックに変換します。

arr.min &blo
于 2010-10-18T15:21:25.123 に答える
14

@ sepp2kの答えはより一般的なものですが、あなたの特定のケースでは、私はただ使用します

arr.min_by(&:last)
arr.max_by(&:last)

それは、中括弧や角括弧、配列インデックスが浮かんでいるよりもはるかに明白だからです。

于 2010-10-18T16:02:59.033 に答える
3

必要なものが最小と最大のすべてである場合は、Enumerable#minmaxメソッドを使用して両方を同時に計算できます。

min, max = arr.minmax {|a,b| a[1] <=> b[1]}
#=> [[5, 1], [2, 7]]
min
#=> [5, 1]
max
#=> [2, 7]

編集:地獄、私はちょうどそこにもあることに気づいたminmax_byので、あなたはそれをメソッドと組み合わせることができlast、そして持っている:

min, max = arr.minmax_by &:last
于 2010-10-18T18:00:48.520 に答える
2

これはどう?

=> [[5, 4], [9, 5], [2, 7]]
>> arr.sort!{|x,y| x[1]<=>y[1] }
=> [[5, 4], [9, 5], [2, 7]]
>> min,max=arr[0],arr[-1]
=> [[5, 4], [2, 7]]
于 2010-10-18T15:26:00.837 に答える
2

このような問題のより一般的な解決策は、ネストされた配列を完全に避け、代わりにクラスを使用することです。次に、そのクラスの<=>演算子を定義して、Comparableミックスイン(http://ruby-doc.org/core/classes/Comparable.html)のすべての関数にアクセスできるようにして<、<= 、==、> =、および>演算子とメソッド'between?'

これは単なる例です。実際には、保存する内容を説明するクラスを使用します。

class Duo

  include Comparable

  def initialize( a, b )
      @a = a
      @b = b
  end

  def <=>(rhs)
      @b <=> rhs.b
  end

end

Duoオブジェクトの配列がある場合は、比較演算子を定義しなくても、min、max、およびsort関数を使用できます。それで...

@a = Duo.new( 1, 10 )
@b = Duo.new( 2, 5 )
@c = Duo.new( 3, 1 )

[ @a, @b, @c ].sort

配列[@c、@ b、@a]を返します

[@a, @b, @c].max

戻るだろう@a

これは、配列内の位置に依存するロジックを備えたネストされたデータ構造よりもはるかに「ルビーウェイ」です。最初は少し手間がかかりますが、長期的にははるかに優れていることがわかります。

Rubyは非常にオブジェクト指向のプログラミング言語であり、非常に強力なツールを使用できます。「TheRubyProgrammingLanguage」や「TheRubyWay」のような本を読んで、言語の力の適切な概要を理解することを強くお勧めします。

于 2010-10-18T17:52:21.223 に答える