質問

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

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

そして、要素の2番目の要素を比較して、最小要素を見つけたいと思います。最小要素は次のとおりです [5, 1] 以来 1 よりも少ない 7. 。次のコードを使用できます。

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

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

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

それは与えます [2, 7].

私は常に同じブロックを使用しています。そのブロックをどこかに持っていて、それを最小/最大関数に提供したいと思います。私は次のようなものを望んでいました:

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

動作しますが、そうではありませんでした。これがどのようにできるかについての考えはありますか?

役に立ちましたか?

解決

使用 & 回転する演算子 Proc ブロックにオブジェクト。

arr.min &blo

他のヒント

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

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

それはそうだからです 多くの これらのすべての巻き毛のブレース、四角い括弧、アレイインデックスが浮かんでいるよりも明白です。

必要なものがすべて最小で最大である場合、使用する場合があります 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

これはどう?

=> [[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]]

このような問題のより一般的な解決策は、ネストされたアレイを完全に避け、代わりにクラスを使用することです。その後、そのクラスの<=>オペレーターを定義して、比較可能なMixin(http://ruby-doc.org/core/classes/comparable.html)のすべての機能にアクセスできるようになります。 、==、> =、および>演算子とメソッド「間」?」

これは単なる例です。実際の生活では、それらが保存するものを説明するクラスを使用します。

class Duo

  include Comparable

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

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

end

DUOオブジェクトの配列がある場合は、比較演算子を定義することなく、MIN、MAX、およびソート機能を使用できます。それで...

@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 Way」です。最初は少し多くの作業が必要ですが、あなたはそれを見つけるでしょう 多くの 長期的にはより良い。

Rubyは非常にオブジェクト指向のプログラミング言語であり、使用するための非常に強力なツールを提供します。 「The Rubyプログラミング言語」や「The Ruby Way」などの本を読んで、言語の力の適切な概要を取得することを徹底的にお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top