Ruby-如何将数据添加到嵌套数组中?

Ruby-如何将数据添加到嵌套数组中?,ruby,multidimensional-array,user-input,nested-loops,Ruby,Multidimensional Array,User Input,Nested Loops,我对Ruby比较陌生,我正在尝试设计一个代码来帮助我工作 我想让代码做的是允许用户从周一开始输入一周中每一天的“发票号码”,然后当用户输入完发票号码后,程序应该询问每天工作了多少小时。然后,我想让程序将工作小时数除以每天输入的发票号,并以如下格式输出“计费时间”: 假设周一工作了10个小时,你输入了123号和124号发票 程序应输出以下内容- Monday #123 - 5 Hours #124 - 5 Hours 但我希望这一周的每一天都能发生。我假设我需要使用嵌套数组,但我只是对如何从用

我对Ruby比较陌生,我正在尝试设计一个代码来帮助我工作

我想让代码做的是允许用户从周一开始输入一周中每一天的“发票号码”,然后当用户输入完发票号码后,程序应该询问每天工作了多少小时。然后,我想让程序将工作小时数除以每天输入的发票号,并以如下格式输出“计费时间”:

假设周一工作了10个小时,你输入了123号和124号发票

程序应输出以下内容-

Monday
#123 - 5 Hours
#124 - 5 Hours 
但我希望这一周的每一天都能发生。我假设我需要使用嵌套数组,但我只是对如何从用户添加条目以及让程序知道何时“移动”到第二天添加下一组条目感到困惑

以下是我目前掌握的代码:

days = ["Mon","Tue","Wed","Thurs","Fri","Sat","Sun"]
entry = Array.new
days.each do |day|
    while entry != "ok"
      puts "Enter PR # for " + day
      puts "/n Type 'ok' when finished"
      entry.each do |input|
        input << gets.to_s.chomp
      end
    end
end
days=[“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”]
entry=Array.new
每天,每天|
进入时!=“好的”
在“+天”中输入“PR”
将“/n完成后键入“确定”
entry.do每个do |输入|
输入嘿–给你–>

给你做了一个要点,也许会有帮助,让我知道

注意:当心
为true时的
,这样您就不会遇到无限循环

以下是便于参考的:

# frozen_string_literal: true
def display_billable_hours(entries)
  entries.each do |key, value|
    puts "#{key}:"
    puts value
  end
end

def handle_input
  days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
  entries = {}

  days.each do |day|

    loop do
      p "Enter your invoice number for #{day}:"
      invoice_number = gets.chomp

      break if invoice_number.length > 0
    end

    loop do
      p "How many hours did you work on #{day}?:"
      hours_worked = gets.chomp
      break if hours_worked.length > 0
    end

    entries[day] = "##{invoice_number} - #{hours_worked} Hours"
  end
  
  entries
end

def do_audit
  entries = handle_input
  display_billable_hours(entries)
end

do_audit

您可以按如下方式收集所需信息

DAYS = ["Mon", "Tue", "Wed", "Thurs", "Fri", "Sat", "Sun"]
然后,您可以通过各种方式显示此信息,如以下所示

h.each do |day, g|
  puts day
  if g[:prs].empty?
    puts "  No invoices"
  else
    avg = (g[:hours]/g[:prs].size).round(2)
    g[:prs].each { |pr| puts "  ##{pr}: #{avg}" }
  end
end
通常,将数据收集与数据操作和结果展示分开是一种良好的做法。这使得以后更容易进行更改


我使用with
break
进行几乎所有的循环。
循环
的一个优点是使用块(不同于
while
until
),将块内创建的局部变量的范围限制在块内。另一个优点是它通过中断循环来处理
StopIteration
异常。当枚举数试图生成超出其最后一个值的元素时,会引发该异常。例如,如果
e=3.times
,那么
e.next#=>0
e.next#=>1
e.next#=>2
e.next#=>停止迭代

嘿,Cary-当我试图按天调用发票功能时,对我来说似乎不会超过周一。在我输入公关部的工作时间后,它会循环返回并再次显示Mon。不仅如此,在理想情况下,我还试图输入一天的工作小时数,然后将其除以输入的公关数字(也就是说,每天工作10个小时,PR-1、PR-2、PR-3的每一个PR#将输出3.33个小时。我希望这是有意义的。非常感谢你花时间来帮助我完成这项工作!!请查看我的编辑,并告诉我它是否还需要工作。卡里-谢谢你!!这正是我想要的!现在我只需要坐下来盯着这段代码看一下就行了。)在接下来的几周里,你的评论让我知道发生了什么!!哈哈!!你是冠军!!卡里-快速提问。你能告诉我为什么使用嵌套数组不是这个程序的有效解决方案吗?是什么让你选择了你所选择的方法?我不太清楚你所说的“嵌套数组”是什么意思。这不是散列吗?您可以将数据保存为,例如,
data=[[[“123”、“124”]、21.05]、[“125”]、31.42]、[“126”、“127”]、68.42]、…]
,因此周三的pr和小时数将是
data[3][0]、[126”、“127”
data[3][1]#=>68.42
,但我相信您会同意散列(我的代码
h)更具描述性,更容易理解:
h[“Wed”]#=>{prs:[“126”,“127”],小时数:68.42}
。你可能会对我的代码印象深刻,但当你获得经验时,你会意识到这其实没什么特别的。嘿,Damilare!谢谢你的帮助。这很接近,但是我希望用户能够每天输入多个PR,并且能够通过输入“ok”或按“ENTER”来打破这个循环,然后它会将一天的工作时间平均分配给用户一周中每天输入的PR量。希望这能让事情变得更清楚一点,但这与我想要的非常接近!!再次感谢您分享您的知识!@DamilareOlusakin:我不会使用
而使用true;…end
,但是more惯用的
loop do;…结束
绝对!@zspark94,很高兴与大家分享。我会根据您的想法进行调整described@user1934428没错,如果用户在给定的一天内输入了多个发票号,则只保存最后一个发票号;也就是说,
invoice\u number
会被覆盖每个条目。小时数相似,但我认为不需要循环,因为只需要每天的总小时数。不清楚您是否需要帮助建模数据,或如何请求用户确认。只在一个问题中询问一个问题。对于混淆,我很抱歉-我正在尝试找到最有效的存储方法g用户在嵌套数组中多次输入,然后确认用户何时完成并移动到数组中的下一个点,并重复该过程,直到用户完成数组中最后一个点的数据输入。(即天[周一[Pr-20,Pr-21,Pr-22],周二[Pr-22,Pr-23,Pr-24])等等。让我们从这个开始。我可以稍后询问有关操纵数据的部分。
h = invoices_by_day
  #=> { "Mon"=>{ prs: ["123", "124"], hours: 21.05 },
  #     "Tue"=>{ prs: ["125"], hours: 31.42 },
  #     "Wed"=>{ prs: ["126", "127"], hours: 68.42 },
  #     "Thu"=>{ prs: ["128"], hours: 31.05 },
  #     "Fri"=>{ prs: [], hours: 0 },
  #     "Sat"=>{ prs: ["129", "130"], hours: 16.71 }
  #     "Sun"=>{ prs: ["131"], hours: 55.92 } }
h.each do |day, g|
  puts day
  if g[:prs].empty?
    puts "  No invoices"
  else
    avg = (g[:hours]/g[:prs].size).round(2)
    g[:prs].each { |pr| puts "  ##{pr}: #{avg}" }
  end
end
Mon
  #123: 10.53
  #124: 10.53
Tue
  #125: 31.42
Wed
  #126: 34.21
  #127: 34.21
Thurs
  #128: 31.05
Fri
  No invoices
Sat
  #129: 8.36
  #130: 8.36
Sun
  #131: 55.92