2016-09-17 70 views
3

我是紅寶石新手。我試圖做到以下,但沒有成功。對象數組中的最大值

我有一個對象數組,我們稱之爲objs。每個對象都有多個屬性,其中一個是一個包含數字的變量,我們稱之爲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

假設你已經設定了以下模型:

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如下來確定與最大val1 val中的對象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 recomended):

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

...或'@ objs.max_by(:VAL1) .val1'。 –

+0

@CarySwoveland你和你的新方法! – Phrogz