对象数组中的最大值

时间:2016-09-17 01:54:12

标签: arrays ruby loops iteration block

我是红宝石的新手。我正在尝试执行以下操作,但没有成功。

我有一个对象数组,我们称之为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 个答案:

答案 0 :(得分:4)

我们假设您已设置以下模型:

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值的对象。最后调用val1以获取 max 对象的值。

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

答案 1 :(得分:3)

<h4 contenteditable="true" [contenteditableModel]="person?.name" ...>

这将调用每个对象上的方法,并创建一个新的结果数组,然后找到最大值。这是:

的简写
@objs.map(&:val1).max

或者,您可以select the object with the largest value,然后对其进行操作(正如下面Cary Swoveland正确推荐的那样):

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