将数组元素与散列键进行比较并将散列值附加到数组

Compare array element to hash key and append hash value to an array

SCORECARD = {
   "1" => 40,
   "2" => 100,
   "3" => 300,
   "4" => 1200
}


def get_score(arr)
  
   score_base = []
  
   #level = getPoints(arr) / 10
   score_base = calculateScore(arr)

end

def getPoints(points)
    points.inject(0) do |sum, point|
       sum + point
    end
end


def calculateScore(lines)
    score_base = []  
    lines.each do |line|
  
        SCORECARD.each do |key, value|
  
            if line == key
                score_base << value
            end
            score_base
        end
     end
end
  

describe "Basic tests" do
  Test.assert_equals(get_score([0, 1, 2, 3, 4]), 1640)
  Test.assert_equals(get_score([0, 1, 1, 3, 0, 2, 1, 2]), 620)
  Test.assert_equals(get_score([2, 0, 4, 2, 2, 3, 0, 0, 3, 3]), 3300)
end

describe "Special tests" do
  Test.assert_equals(get_score([0]), 0)
  Test.assert_equals(get_score([]), 0)
end

Test Results:
Basic tests
Expected: 1640, instead got: [0, 1, 2, 3, 4]
Expected: 620, instead got: [0, 1, 1, 3, 0, 2, 1, 2]
Expected: 3300, instead got: [2, 0, 4, 2, 2, 3, 0, 0, 3, 3]
STDERR
/runner/frameworks/ruby/cw-2.rb:60:in `block in describe': Expected: 1640, instead got: [0, 
1, 2, 3, 4] (Test::Error)
    from /runner/frameworks/ruby/cw-2.rb:46:in `measure'
    from /runner/frameworks/ruby/cw-2.rb:51:in `describe'
    from /runner/frameworks/ruby/cw-2.rb:202:in `describe'
    from main.rb:46:in `<main>'

问题:我在调试 calculateScore 方法时需要帮助。本质上,我想遍历行数组和 SCORECARD 哈希,然后检查当前行是否等于哈希键,最后将匹配键的值推入 score_base 数组.

一旦我将所有值都推入 score_base 数组,我计划将 score_base 数组中的每个元素乘以用户的当前级别,然后将所有元素相加到 totalScore.

输出似乎只有 return lines 数组中的元素。有人可以阐明正在发生的事情吗?

编辑:我的问题解决方案

```
SCORECARD = {
  "1" => 40,
  "2" => 100,
  "3" => 300,
  "4" => 1200
}

def get_score(arr)
  totalScore = multiplyByLevel(arr)
end

def calculateScore(line)
  score_base = []
  
   score_base.push SCORECARD.fetch(line.to_s, 0)  
   score_base.reduce(:+)
end

def multiplyByLevel(points)
  experience = 1.0
  level = 0
  totalScore = 0
  
  points.each do |point|
   
    experience = experience.round(1) + (point.to_f / 10)
  
    if level < 2
      totalScore = totalScore + (1 * calculateScore(point))
    elsif level >= 2
      totalScore = totalScore + (level.round(1) * calculateScore(point))
    else
      print "Outside loop, level is #{level}"
    end
    level = experience.to_i
    
  end  
  
  totalScore
end
```

编辑:对 BOBRODES 反馈的回应:重构计算得分方法

```
def calculateScore(lines)
  score_base = []
  lines.map {|line| score_base << SCORECARD[line.to_s]}
  score_base.compact
end
#=> [40,100,300,1200]
```

数组的 each 方法 returns 数组本身(来自文档:“每个 {|item| 块} → ary”)这就是你得到的。查看 map。注意getPoints方法并没有实际使用,所以没有计算sum

你的基本问题是 #each 总是 return 接收者(接收者.each 左边的任何东西) .让我们看看您的代码:

def calculateScore(lines)
  score_base = []  
  lines.each do |line|
    SCORECARD.each do |key, value|
      if line == key
        score_base << value
      end
      score_base
    end # << returns SCORECARD
  end # << returns lines
end 

因此,您需要在此处输入 score_base

def calculateScore(lines)
  score_base = []  
  lines.each do |line|
    SCORECARD.each do |key, value|
      if line == key
        score_base << value
      end
    end # << returns SCORECARD
  end # << returns lines
  score_base
end 

这是对 steenslag 回答第一部分的解释,但我也会看看他的建议的其余部分。

您的代码还有其他问题。 SCORECARD 中的键是字符串,而 lines 的测试输入中的值是整数。因此,一旦您解决了您询问的问题,您的结果将始终是一个空数组。

但是你的代码还有一个更大的问题,那就是你用#map简单的一行代码就可以得到你想要的东西!您当然可以在仍然使用 #each 的同时大量​​压缩您的代码,但是 #map 旨在在遍历值时转换值,而 #each 旨在仅遍历它们。您想要转换您的值(从 SCORECARD 键到 SCORECARD 值),因此 #map 是最简单的方法。

我不想带走所有的乐趣而给你做,所以这里有一个简单的例子 #map:

[1, 2, 3, 4].map { |num| num + 1 } #=> [2, 3, 4, 5]

看看您是否可以通过测试输入 [0, 1, 2, 3, 4] 和 return [nil, 40, 100, 300, 1200] 采纳该想法。然后,弄清楚如何将所有这些加在一起(有一种方法可以删除 nil 值,您会发现它很有用),您将拥有一条线。