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."
之间可数无限数量的名称
我想完成两件事:
- 伪代码:
puts "#{worker} worked #{hours} and earned
$#{dollars}.00"
适用于 WorkersPay 和 WorkersHrs 中的每个工人
- 不按字母顺序排序,而是按工作小时数排序
(如果工人工作时间为零,最后列出他们并且只是伪
代码:
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 对的 value(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 字符串格式以获取信息。
我有以下哈希:
WorkersPay
:
{"Aaron"=>[300], "Alex"=>[684], ... , "Wendy"=>[792] , "Zach"=>[281]}
和WorkersHrs
:
{"Aaron"=>[36], "Alex"=>[34], ... , "Wendy"=>[39], "Zach"=>[42]}
其中省略号 (...) 表示 "Alex," 和 "Wendy."
之间可数无限数量的名称我想完成两件事:
- 伪代码:
puts "#{worker} worked #{hours} and earned $#{dollars}.00"
适用于 WorkersPay 和 WorkersHrs 中的每个工人 - 不按字母顺序排序,而是按工作小时数排序
(如果工人工作时间为零,最后列出他们并且只是伪
代码:
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 对的 value(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 字符串格式以获取信息。