2017-10-25 6 views
0

필자는 기수 정렬을 위해 잠시 동안이 코드에서 작업 해왔다. 해쉬 내의 배열에 값을 넣을 때까지 모든 것이 잘 어울리는 것처럼 보였습니다. 값이 nil이라는 오류 메시지가 표시되지만 배열에 저장하려고하기 직전에 모든 값을 확인한 후에도 그렇게 할 수는 없습니다. 어떤 아이디어? buckets [sdigit] .push (num)는 내 값 중 하나가 0이라고 알려주는 행입니다.해시 내의 배열에 값을 푸시

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 ` 

답변

2

버킷 [sdigit] .push (NUM)는 나에게 내 값 중 하나 가 nil 일을 알려 줄 것입니다.

오류 메시지를 보면 :

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 의해 표시된 값과 식으로 사용되는 것들 사이의 불일치이다 대신 [sdigit][digit], 그리고 그 오류를 발생시키는 추적이다.

개인적으로 나는 오류가 발생할 수있는 문 앞에 식에 의해 사용될 값을 보여주기 때문에 개인적으로 추적 할 문 앞에 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 
:

나는 약간의 코드를 재 배열했다