对象数组中的最大值

Seb*_*ian 4 ruby arrays iteration loops 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
Run Code Online (Sandbox Code Playgroud)

正如我所说,我只是在学习块。

任何建议都欢迎。

谢谢

Phr*_*ogz 5

@objs.map(&:val1).max
Run Code Online (Sandbox Code Playgroud)

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

@objs.map{ |o| o.val1 }.max
Run Code Online (Sandbox Code Playgroud)

或者,您可以选择具有最大值的对象,然后对其进行操作(如下 Cary Swoveland 的正确推荐):

@objs.max_by(&:val1).val1
Run Code Online (Sandbox Code Playgroud)

  • ...或`@objs.max_by(&:val1).val1`。 (3认同)

Sag*_*dya 5

假设您已建立以下模型:

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]
Run Code Online (Sandbox Code Playgroud)

然后max_by将条件按如下所述通过将其传递到其块中来确定具有最大值的对象val1。最后调用val1以获取max对象的值。

array.max_by {|e| e.val1 }.val1 #=> 33
Run Code Online (Sandbox Code Playgroud)

您也可以考虑使用散列(无需定义新类),如下所示:

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
Run Code Online (Sandbox Code Playgroud)