【问题标题】:Max value within array of objects对象数组中的最大值
【发布时间】:2017-01-25 07:31:00
【问题描述】:

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

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

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

欢迎提出任何建议。

谢谢

【问题讨论】:

    标签: arrays ruby loops iteration block


    【解决方案1】:

    假设您设置了以下模型:

    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
    

    【讨论】:

    • 像魅力一样工作。问题,array.max_by {|e| e.val1 } 返回一个“e”对象?这就是为什么我们必须在最后使用 .val1 访问它? array.max_by {|e| e.val1 }.val1
    • @Sebastian 是的,尽管将其描述为“e”对象是不正确的。 array.max_by {|e| e.val1 } 返回一个 SomeObject 对象。我们在最后调用val1 方法来确定它的val1 属性。例如,如果我们想要名字,我们也可以调用prop1。希望这会有所帮助。
    • 是的,很多。谢谢
    • @Sebastian,也许考虑使用哈希?我已经更新了我的答案。
    【解决方案2】:
    @objs.map(&:val1).max
    

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

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

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

    @objs.max_by(&:val1).val1
    

    【讨论】:

    • ...或@objs.max_by(&:val1).val1
    • @CarySwoveland 你和你的新奇方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2015-03-15
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多