【问题标题】:Student Marks Hash学生分数哈希
【发布时间】:2016-07-30 03:07:33
【问题描述】:

我见过用其他语言发布的解决方案,但不是 Ruby,所以我在这里问。

我正在尝试使用 Ruby 创建一个学生评分系统,这应该获取学生的姓名和该特定学生的用户的两个分数。

我决定尝试将这些存储在哈希中,这样它最终会看起来像:

    student_marks = {
        "Steve" => 45, 65,
        "James" => 20, 75,
        "Scott" => 30, 90
    }

我的代码尝试如下:

    continue = "y"

    student_grades = Hash.new

    while continue == "y"

    puts "Please enter student name"
    name = gets.chomp

    puts "Please enter the first grade for #{name}"
    grade_one = gets.chomp.to_i

    puts "Please enter the second grade for #{name}"
    grade_two = gets.chomp.to_i


        student_grades.each do |key, value|
            student_grades[key] = name
            student_grades[value] = grade_one
            student_grades[value][1] = grade_two

         end

        puts "Do you want to continue? y or n"
        continue = gets.chomp

    end


    puts student_grades

显然,我的逻辑在尝试使用每个/迭代填充哈希时存在问题,因为我不断得到 nil 返回。我想我可以使用数组并从中填充散列,但是有没有办法使用来自用户输入的迭代来填充键和值的散列?

【问题讨论】:

  • 你的预期结果一开始就无效。
  • 在您的代码中,您以 student_grades 作为空哈希开始,然后对其进行迭代,这意味着您没有对它做任何事情。
  • 糟糕,谢谢!看来我对哈希的逻辑完全错误。

标签: ruby hash iteration each


【解决方案1】:

您似乎误解了哈希在 Ruby 中的工作方式。我建议您阅读一下。

同时,试试这个:

student_grades = Hash.new {|h,k| h[k] = [] }

现在每次获得学生成绩时,都可以将其推送到该学生哈希键的数组值中。

例如:

student_grades
=> {}

student_grades['Mark'] << 95
student_grades['Mark'] << 86

student_grades
=> {'Mark' => [95, 86]}

您根本不需要在循环的每次运行中迭代哈希,只有在需要从中提取一些信息时才应该这样做。

【讨论】:

  • 感谢您的建议,您的回答很明确。看起来我的哈希逻辑错了,回到书本上。
  • 在 Ruby 中让一些人感到困惑的部分是,当实例化一个新的哈希时,如果您希望 Ruby 为每个键假定一个初始值,您必须具体说明该值。例如,如果你只想设置一个等级,比如grades['Mark'] = 95,这没问题,但是如果你想创建一个像counts['thing'] += 1 这样的计数器,Ruby 不会假设起始值为0 - 因此你必须将你的哈希实例化为Hash.new(0),这样 Ruby 就知道你想从什么开始。这里也是一样,我们告诉 Ruby 每个新键都应该以一个新的 Array 对象作为值开始。
猜你喜欢
  • 2013-06-10
  • 2016-10-07
  • 1970-01-01
  • 2012-11-19
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多