2016-11-19 120 views
0

在創建一個冒泡排序程序我就遇到了這個錯誤:未定義的方法`<」的零:NilClass

test.rb:8:in `block in bubble_sort': undefined method `<' for nil:NilClass (NoMethodError) 
    from test.rb:6:in `downto' 
    from test.rb:6:in `bubble_sort' 
    from test.rb:16:in `<main> 

沒有人知道這是什麼意思?下面是代碼:

def bubble_sort(arr) 
    length = arr.length 
    sorted = false 


    length.downto(0) do |cntr| 

     if arr[cntr] < arr[cntr + 1] 

     end 


    end 
end 

bubble_sort([2,6,8,1,0,2]) 

回答

3

錯誤消息undefined method '<' for nil:NilClass意味着您正嘗試致電<處理nil

在你的例子中,必須是if arr[cntr] < arr[cntr + 1]比較。在下一步中,我們需要找出爲什麼arr[cntr]nil。其中一個原因可能是數組中的元素cntr索引中沒有元素,另一個原因可能是索引cntr超出了數組的範圍。在你的例子中,這是造成問題的第二個原因。

爲什麼索引超出範圍?讓我們仔細看看循環是如何建立和使用實例陣列[a, b, c]這樣做:

length = arr.length    # length = 3    # [a, b, c].length 
length.downto(0) do |cntr|  # 3.downto(0) do |cntr| 
    if arr[cntr] < arr[cntr + 1] # if arr[3] < arr[4] # in the first iteration 

行動,沒有沒有索引3arr陣列中4,因爲指數開始0和計數在我的例子中只有3個元素(這使得最後一個元素的索引2)。

的修復:

def bubble_sort(array) 
    (array.length - 2).downto(0).each do |index| 
    if array[index] < array[index + 1] 
     # ... 
    end 
    end 
end 
+0

感謝您的詳細解釋! – jibzoiderz

2

does anyone know what does that mean?

這意味着arr[cntr]在此表達

if arr[cntr] < arr[cntr + 1] 

哦零,如果這個人是零,那麼arr[cntr + 1]絕對爲零。

提示:您正在訪問數組邊界外的元素。

+0

爲什麼是ARR [0]超出界限?那裏顯然有東西 – jibzoiderz

+0

你爲什麼認爲它是0? –

+0

nvm通過將長度1置於downto – jibzoiderz

0

在您的代碼length變量值將是6length = arr.length)。 當你迭代到0 ...在第一次迭代cntr變量值將是6。 因此arr[cntr]正在獲取nil值,因爲您正在訪問數組的邊界外的元素。這就是爲什麼你會得到undefined method < for nil:NilClass (NoMethodError)錯誤。

相關問題