我有以下哈希:
WorkersPay
:
{"Aaron"=>[300], "Alex"=>[684], ... , "Wendy"=>[792] , "Zach"=>[281]}
和WorkersHrs
:
{"Aaron"=>[36], "Alex"=>[34], ... , "Wendy"=>[39], "Zach"=>[42]}
省略号(...)表示“亚历克斯”和“温迪”之间有无数个名字。
我想完成两件事:
puts "#{worker} worked #{hours} and earned
$#{dollars}.00"
适用于WorkersPay和WorkersHrs中的每个工作人员puts "#{worker} worked #{hours} this week"
)我搜索了SO几天,这是我迄今为止最好的代码:
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 $36.00
.
.
.
Sam worked 0 hours this week
垂直椭圆表示与常规椭圆完全相同的东西。
我之前从未使用过包含键,数组对的哈希,并且非常感谢所有帮助让我可怕的代码工作!
答案 0 :(得分:1)
请注意,在Ruby中,如果你对Hash进行排序,那么Ruby会首先将它转换为数组数组,其中&#34; inner&#34;数组各有2个元素:键和值。
要对WorkHrs
进行排序,那么您只需要:
SortHrs = WorkHrs.sort_by { |wh| wh[1] }.reverse # reverse order of hours
这表示您希望通过每个内部数组的第二个元素对数组数组进行排序。这是WorkHrs.sort_by { |a,b| a[1] <=> b[1] }
的简写,因为a <=> b
是默认的比较方法。
隐含地,Ruby会在排序之前使WorkHrs
看起来像这样:
[["Aaron", [36]], ["Alex", [34]], ... , ["Wendy", [39]], ["Zach", [42]]]
wh[1]
是数组元素的键值对的值(wh[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字符串格式以获取信息。