2016-09-17 64 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