2016-09-17 13 views
3

です。私はRubyで新しくなっています。私は次のことをしようとしていますが、成功していません。オブジェクトの配列内の最大値は

私はオブジェクトの配列を持っています、それをobjsと呼ぶことにしましょう。各オブジェクトには複数のプロパティがあり、そのうちの1つは数値を保持する変数です。それをval1と呼ぶことにします。私はオブジェクトの配列を反復し、すべてのオブジェクトを通してval1の最大値を決定したいと思います。

def init(objs) 
    @objs = objs 
    @max = 0 
    cal_max 
end 

def cal_max 

    @max = @objs.find { |obj| obj.val1 >= max } 

    # also tried 
    @objs.each { |obj| @max = obj.val1 if obj.val1 >= @max } 

end 

私が言ったように、私はちょうどブロックについて学んだ:

は、私は、次の試してみました。

ご提案は大歓迎です。各オブジェクトのメソッドを呼び出し、その結果の新しい配列を作成し、最大値を見つける

おかげ

答えて

2

あなたは次のモデルを設定しているとしましょう:最大val1 Valにオブジェクトを決定するために、次のように

class SomeObject 
    attr_accessor :prop1, :prop2, :val1 

    def initialize(prop1, prop2, val1) 
    @prop1 = prop1 
    @prop2 = prop2 
    @val1 = val1 
    end 
end 

#define your objects from the class above 
david = SomeObject.new('David', 'Peters', 23) 
steven = SomeObject.new('Steven', 'Peters', 26) 
john = SomeObject.new('John', 'Peters', 33) 

#define an array of the above objects 
array = [david, steven, john] 

そのブロックに条件を渡すことによってmax_byを使用ue。最後にval1を呼び出して最大オブジェクトの値を取得します。

array.max_by {|e| e.val1 }.val1 #=> 33 

またそうのように、ハッシュ(新しいクラスを定義する必要性を否定)を使用して検討してください。

david = {f_name: 'David', s_name: 'Peters', age: 23} 
steven = {f_name: 'Steven', s_name: 'Peters', age: 26} 
john = {f_name: 'John', s_name: 'Peters', age: 33} 

array = [david, steven, john] 
array.max_by { |hash| hash[:age] }[:age] #=> 33 
+0

チャームのように働いた。質問、しないでくださいarray.max_by {| e | e.val1}は 'e'オブジェクトを返しますか?それで、最後に.val1でアクセスする必要があるのはなぜですか? array.max_by {| e | e.val1} .val1 – Sebastian

+1

@Sebastianはい、それを 'e'オブジェクトとして記述するのは間違いです。 'array.max_by {| e | e.val1} 'は_SomeObject_オブジェクトを返します。最後に 'val1'プロパティを決定するために' val1'メソッドを呼び出します。たとえば、最初の名前が必要な場合は 'prop1'を呼び出すこともできます。お役に立てれば。 –

+0

はい、それはたくさんあります。ありがとう – Sebastian

3
@objs.map(&:val1).max 

。これは、速記のために:また

@objs.map{ |o| o.val1 }.max 

、あなたがselect the object with the largest valueをすることができますし、(のように適切に下記ケーリーSwovelandでお奨め)、それを操作:

@objs.max_by(&:val1).val1 
+2

...または '@のobjs.max_by(&:VAL1) .val1'。 –

+0

@CarySwovelandあなたとあなたの新しい方法! – Phrogz

関連する問題