Ruby:排序,"puts," 通过循环遍历包含数组的多个哈希

Ruby: Sorting and, "puts," by Looping Through Multiple Hashes Containing Arrays

我有以下哈希:

WorkersPay:

{"Aaron"=>[300], "Alex"=>[684], ... , "Wendy"=>[792] , "Zach"=>[281]}

WorkersHrs

{"Aaron"=>[36], "Alex"=>[34], ... , "Wendy"=>[39], "Zach"=>[42]}

其中省略号 (...) 表示 "Alex," 和 "Wendy."

之间可数无限数量的名称

我想完成两件事:

  1. 伪代码:puts "#{worker} worked #{hours} and earned $#{dollars}.00" 适用于 WorkersPay 和 WorkersHrs 中的每个工人
  2. 不按字母顺序排序,而是按工作小时数排序 (如果工人工作时间为零,最后列出他们并且只是伪 代码:puts "#{worker} worked #{hours} this week")

我已经搜索了好几天了,这是我迄今为止最好的代码:

WorkerHrs.each do |key, array|
    WorkerHrs.sort_by { |a, b| a[0] <=> b[0] }
    WorkerPay.each do |key2, array2|
        if key == key2
            if array.inject{|a,i| a*10 + i} == 0
                puts "#{key} worked #{array.inject{|a,i| a*10 + i}} hours this week"
            else
               puts "#{key} worked #{array.inject{|a,i| a*10 + i}} hours and earned $#{array2.inject{|a,i| a*10 + i}}.00"
            end
        end
    end
end

希望实现:

John worked 80 hours and earned .00
                 .
                 .
                 .
Sam worked 0 hours this week

其中垂直省略号表示与常规省略号完全相同的内容。

我以前从未使用过包含键、数组对的散列,我将不胜感激任何和所有帮助让我可怕的代码工作!

请注意,在 Ruby 中,如果您对哈希进行排序,则 Ruby 将首先将其转换为数组数组,其中 "inner" 数组每个包含 2 个元素:键和值。

要对WorkHrs进行排序,那么,你只需要这样:

SortHrs = WorkHrs.sort_by { |wh| wh[1] }.reverse  # reverse order of hours

这表示您想按每个内部数组的第二个元素对数组数组进行排序。这是 short-hand 因为 WorkHrs.sort_by { |a,b| a[1] <=> b[1] } 因为 a <=> b 是默认的比较方法。

隐含地,Ruby 将使 WorkHrs 在排序前看起来像这样:

[["Aaron", [36]], ["Alex", [34]], ... , ["Wendy", [39]], ["Zach", [42]]]

wh[1] 是数组元素的 key-value 对的 valuewh[0] 将是键)。

然后你处理它:

SortHrs.each do |wh|
  if wh[1] == 0     # Hours worked is 0?
    puts "#{wh[0]} worked 0 hours this week"
  else
    puts "#{wh[0]} worked #{wh[1]} hours and earned $#{WorkersPay[wh[0]].first}"
  end
end

在这里,WorkersPay[wh[0]] 使用 wh[0](此人的姓名)作为访问哈希值的密钥。 .first 获取第一个(在本例中是唯一的)元素。您也可以使用 WorkersPay[wh[0]][0].

这就是它的全部内容。我将把支付金额的格式留作练习。查找 Ruby 字符串格式以获取信息。