【问题标题】:Group by hash in Ruby在 Ruby 中按哈希分组
【发布时间】:2015-11-18 11:58:02
【问题描述】:

我的目标是对姓名和数字进行哈希处理,例如:

hash = {
  "Matt" => 30,
  "Dave" => 50,
  "Alex" => 60
}

并根据他们是否达到“及格”分数对他们进行分组。我希望将结果作为数组传递给两个单独的键,例如 :pass:fail,如下所示:

hash = { "pass" => ["Alex", 60], "fail" => [["Matt", 30]["Dave",60]]}

我知道group_by 方法是我需要的,但不确定如何将值传递到新键中。

及格等级应由用户决定。对于此示例,您可以使用 45。

【问题讨论】:

  • 1. "Dave"的评分60是什么逻辑?
  • 2.什么是“及格分数”?
  • 3.使"Alex"(60)通过而"Dave"(不知何故60)失败的逻辑是什么?
  • 4.你的hash 没有:pass:fail 的键,有"pass""fail"
  • @sawa 我很欣赏你的意见,我的例子不是最好的——我只是使用任意数字

标签: ruby hash


【解决方案1】:

你可以这样做:

PASSING_GRADE = 45
hash.group_by {|_, v| v >= PASSING_GRADE ? 'pass' : 'fail'}

结果如下:

{"fail"=>[["Matt", 30], "pass"=>[["Alex", 60], ["Dave", 50]]]}

【讨论】:

  • 这很有帮助。我步履蹒跚,因为我不熟悉语法的 ":pass : :fail" 部分
  • 如果你愿意,你可以使用“if”,但我认为这里最好使用三元运算符
【解决方案2】:

你可以简单地做这样的事情:

sorted = {"pass" => [], "fail" => []}
hash.each do |name, grade|
  if grade >= PASSING_GRADE
    sorted["pass"] << [name, grade]
  else
    sorted["fail"] << [name, grade]
  end
end

【讨论】:

    【解决方案3】:

    这里有两种方法:

    #1

    a = hash.to_a 
    { "pass" => a.select { |_,v| v > 50 }, "fail" => a.reject { |_,v| v > 50 } }
      #=> {"pass"=>[["Alex", 60]], "fail"=>[["Matt", 30], ["Dave", 50]]}
    

    #2

    [:pass, :fail].zip(hash.to_a.partition { |_,v| v > 50 }).to_h
      #=> {:pass=>[["Alex", 60]], :fail=>[["Matt", 30], ["Dave", 50]]} 
    

    它们都以元组数组的形式给出返回值,你想要 "fail" 而不是 "pass"。这不会让工作变得很痛苦吗?两者都是元组数组不是更好吗?

    考虑返回值的哈希值:

     {"pass" => hash.select { |_,v| v > 50 }, "fail" => hash.reject {|_,v| v > 50 }}
       #=> {"pass"=>{"Alex"=>60}, "fail"=>{"Matt"=>30, "Dave"=>50}}
    

    这样不是更方便吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2020-02-13
      • 1970-01-01
      • 2018-11-15
      • 2011-05-19
      • 2021-02-05
      • 2013-07-06
      相关资源
      最近更新 更多