将值推入散列中的数组

Posted

技术标签:

【中文标题】将值推入散列中的数组【英文标题】:pushing a value into an array within a hash 【发布时间】:2017-10-25 22:36:38 【问题描述】:

我已经在这段代码上工作了一段时间了。在我尝试将一个值推入散列中的数组之前,一切似乎都很好。 我收到一条错误消息,该值为零,但是我在尝试将所有有问题的值存储在数组中之前检查了所有有问题的值,但它仍然不允许我这样做。有任何想法吗? buckets[sdigit].push(num) 是告诉我我的值之一是 nil 的行。

    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】:

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],这就是导致错误的跟踪。

我个人在要跟踪的语句之前写了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

【讨论】:

以上是关于将值推入散列中的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中动态地将值推入对象的属性?

如何根据散列中的键/值查找键/值数据并将其添加到 Redis 中的散列?

ActionScript 3 模板系统(用散列中的项替换字符串中的项)

如何交换散列中的键和值

模板系统(用散列中的项替换字符串中的项)

Rails 从 JSON 数据中访问散列中的键