我一直在使用此代码进行基数排序。在我尝试将值推入哈希值中的数组之前,所有内容似乎都很好。 我得到一个错误消息,该值为nil,但是我在尝试将它们存储在数组中之前检查了所有有问题的值,但它仍然不允许我这样做。有任何想法吗? buckets [sdigit] .push(num)是告诉我其中一个值为零的行。
arr = []
while arr.size < 100
arr.push(rand(1000))
end
for outer_index in arr
puts "for outer index(#{outer_index} in arr"
buckets = Hash.new()
puts "buckets = Hash.new()"
puts "for j in 0..9"
for j in 0..9
buckets[j.to_s] = Array.new()
#buckets[j.to_s] = [j]
puts "buckets[j.to_s(#{buckets[j.to_s]})"
end
for inner_index in arr
puts "for inner_index(#{inner_index}) in arr"
num = inner_index
puts "num(#{num}) = inner_index(#{inner_index})"
sdigit = num.to_s[-1]
puts "sdigit(#{sdigit}) = num.to_s[-1](#{num.to_s[-1]})"
digit = sdigit.to_i
puts "digit(#{digit}) = sdigit.to_i(#{sdigit.to_i})"
puts "buckets[digit] = #{buckets[sdigit]}"
puts "#{buckets["1"]}"
puts "o#{num}"
puts buckets
buckets[sdigit].push(num)
puts "buckets[digit].push(num)(#{buckets[digit].push(num)})"
end
arr = buckets.values.flatten
end `
答案 0 :(得分:2)
buckets [sdigit] .push(num)是告诉我其中一个值的行 是零。
如果您查看错误消息:
top.rb:30:in `block (2 levels) in <main>': undefined method `push' for nil:NilClass (NoMethodError)
和你的代码:
您看到第30行是puts
,而不是buckets[sdigit].push(num)
。
原因:puts
显示的值与表达式使用的值之间存在差异:[digit]
而不是[sdigit]
,这是导致错误的跟踪。< / p>
我个人在跟踪语句之前编写puts
跟踪,因为它显示了语句之前将使用的值,这些值可能导致执行错误。它通常有帮助...除非跟踪本身出错。
我稍微重新安排了您的代码:
arr = []
100.times { arr << rand(1000) }
puts arr.join(', ')
arr.each do | outer_index |
puts "===== for outer_index=#{outer_index} in arr"
buckets = Hash.new()
puts "buckets = Hash.new()"
puts "for j in 0..9"
(0..9).each do | j |
buckets[j.to_s] = Array.new()
#buckets[j.to_s] = [j]
puts "buckets[#{j.to_s}]=#{buckets[j.to_s]}"
end
arr.each do | inner_index |
puts "----- for inner_index=#{inner_index} in arr"
num = inner_index
puts "num(#{num}) = inner_index(#{inner_index})"
sdigit = num.to_s[-1]
puts "sdigit(#{sdigit}) = num.to_s[-1](#{num.to_s[-1]})"
digit = sdigit.to_i
puts "digit(#{digit}) = sdigit.to_i(#{sdigit.to_i})"
puts "buckets[digit] = #{buckets[sdigit]}"
puts "#{buckets["1"]}"
puts "o#{num}"
puts buckets
puts "buckets[sdigit].push(num)=buckets[#{sdigit}].push(#{num})"
buckets[sdigit].push(num)
# puts "buckets[digit].push(num)(#{buckets[digit].push(num)})"
end
arr = buckets.values.flatten
end