将值推入散列内的数组中

时间:2017-10-25 22:36:38

标签: arrays ruby sorting hash radix-sort

我一直在使用此代码进行基数排序。在我尝试将值推入哈希值中的数组之前,所有内容似乎都很好。 我得到一个错误消息,该值为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 `

1 个答案:

答案 0 :(得分:2)

  

buckets [sdigit] .push(num)是告诉我其中一个值的行   是零。

如果您查看错误消息:

top.rb:30:in `block (2 levels) in <main>': undefined method `push' for nil:NilClass (NoMethodError)

和你的代码:

enter image description here

您看到第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