红宝石哈希搜索两个条件

时间:2019-02-24 22:32:33

标签: ruby-on-rails ruby

grades = [
  {:student=>"James", :age=>19, :score=>85},
  {:student=>"Kate", :age=>19, :score=>92},
  {:student=>"Sara", :age=>20, :score=>74},
  {:student=>"Riley", :age=>20, :score=>85},
  {:student=>"patrick", :age=>20, :score=>96},
  {:student=>"luke", :age=>21, :score=>88},
  {:student=>"susie", :age=>21, :score=>90}
]

我试图让得分最高的学生是20岁,但只能按所有学生的最高得分进行排序。有谁知道如何将max_by限制为上述哈希中只有20岁的学生?

3 个答案:

答案 0 :(得分:4)

  1. 为20岁的人们过滤器
  2. 找到最高分

    grades.select { |person| person[:age] == 20 }.max_by { |person| person[:score] }
    

答案 1 :(得分:1)

我的目标是通过哈希一次。

最初,我发布了以下内容,但它是不正确的,因为如果没有20岁的学生,它会返回不为20的学生的姓名。

grades.max { |h| h[:age] == 20 ? h[:score] :
  -Float::INFINITY }[:student]

这是我的修改后答案:

def best20(grades)
  student = nil
  highest = -Float::INFINITY
  grades.each do |h|
    if h[:age] == 20 && h[:score] > highest
      highest = h[:score]
      student = h[:student]
    end
  end
  student
end

best20 grades
  #=> "patrick"

best20 [{:student=>"James", :age=>19, :score=>85}]
  #=> nil

答案 2 :(得分:0)

就像想法一样。

假设我们有几名20岁的学生,他们的最高分数相同。

在这种情况下,Cary和Ursus的变体只返回第一人称。

因此,我想到了这样的想法

AppBarLayout

不要严格判断,这只是一个主意。