【发布时间】:2021-10-10 18:08:38
【问题描述】:
我正在尝试从数字字符串中筛选数字并计算每个不同数字的每次出现。 在我看来,我的语法看起来是正确的,但我的 case 语句经常收到语法错误; “出乎意料的‘何时’”。 有人可以告诉我我在这里做错了什么吗?
prime_string = "23571113171923293137414347535961677173798389971011031071091131271311371391"
zeroes = 0
ones = 0
twos = 0
count_array = [zeroes, ones, twos]
def numsort(d)
case d
when 0
zeroes++
when 1
ones++
when 2
twos++
else
puts "err"
end
end
while prime_string.length > 0 do
numsort(prime_string.split.shift)
end
puts count_array
【问题讨论】:
-
缺少
end -
哦,嘿,在 ruby 中也没有
++。 stackoverflow.com/questions/3717519/… 改用zeroes +=1 -
感谢您的帮助!
-
我们可以先将字符串转换为数组:
prime_string.chars #=> ["2", "3", "5",..., "9", "1"]。接下来在数组上调用Enumerable#tally 以创建计数哈希:prime_string.chars.tally #=> {"2"=>4, "3"=>14, "5"=>3, "7"=>12, "1"=>22, "9"=>8, "4"=>3, "6"=>2, "8"=>2, "0"=>4}。然后使用Hash#values_at构造数组count_array:prime_string.chars.tally.values_at("0", "1", "2") #=> [4, 22, 4]。 -
我们可以通过两种方式改进这一点。首先,在创建计数哈希之前,从
prime_string.chars:prime_string.chars.select { |c| ["0", "1", "2"].include?(c) } #=> ["2", "1", "1", ..., "1"]生成的数组中只选择感兴趣的元素。其次,如果我们用each_char替换chars,我们会得到一个枚举器,它比(中间)数组prime_string.chars需要更少的存储空间。然后我们得到prime_string.each_char.select { |c| ["0", "1", "2"].include?(c) }.tally.values_at("0", "1", "2") #=> [4, 22, 4]。
标签: ruby syntax-error case