【问题标题】:Array#each not performing as expected with nested while loopArray#each 在嵌套的 while 循环中未按预期执行
【发布时间】:2014-03-09 01:09:50
【问题描述】:

下面的方法根据letter_frequencies 散列随机生成用于 Boggle 的 16 个骰子中每一个的 6 个面的字母。当代码运行时,它遍历boggle_dice 的第一个元素,一个空数组,用随机字母填充它。

但是,它继续使用第一次迭代来填充 boggle_dice 中的其他 15 个元素,并使用它为第一个元素随机选择的相同字母。 是什么导致了这种情况发生,应该如何改变迭代过程以按预期工作?

在迭代结束时,每个键在boggle_dice 中出现的次数应等于在散列中与其关联的值。

def create_board
  letter_frequencies = {
    'e' => 10,
    'a' => 8,
    'i' => 7,
    'o' => 6,
    'l' => 5,
    'n' => 5,
    's' => 5,
    't' => 5,
    'd' => 4,
    'r' => 4,
    'u' => 4,
    'b' => 3,
    'c' => 3,
    'g' => 3,
    'h' => 3,
    'm' => 3,
    'p' => 3,
    'y' => 3,
    'f' => 2,
    'k' => 2,
    'v' => 2,
    'w' => 2,
    'j' => 1,
    'q' => 1,
    'x' => 1,
    'z' => 1
  }

  boggle_dice = Array.new(16, [])
  boggle_dice.each do |die| 
    while die.length < 6 do 
      random_letter = letter_frequencies.keys.sample
      letter_frequencies[random_letter] <=0 ? next : die << random_letter
      letter_frequencies[random_letter] -= 1
    end
  end
end

【问题讨论】:

    标签: ruby arrays loops collections iteration


    【解决方案1】:

    这是初学者的常见错误。那是因为你做了Array.new(16, []),同一个数组被反复修改。可以通过将其更改为Array.new(16){[]} 来修复它。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多