2013-07-09 60 views
0

我已經實現了算法來計算數組倒數(它也合併了數組),但爲了使它更整潔,我希望對輸出進行排序和計數。調用私有方法問題

方法* count_and_sort *返回數組[number_of_inversions,[sorted_array]]。 方法倒置和* merge_sort *應該返回number_of_inversions和[sorted_array]分開,而是我得到NoMethodError

我錯過了什麼?


class Array 

    def inversions 
     count_and_sort[0] 
    end 

    def merge_sort 
     count_and_sort[1] 
    end 

    def merge_sort! 
     replace merge_sort 
    end 

private 

    def count_and_sort 
     return [0, self] if self.size <= 1 
     left, right = partition.with_index{ |value, index| index < self.size/2} 
     left = left.count_and_sort 
     right = right.count_and_sort 
     merged = merge(left[1], right[1]) 

     [left[0] + right[0] + merged[0], merged[1]] 
    end 

    def merge(left, right) 
     inversions = 0 
     merged = [] 
     until left.empty? || right.empty? 
      if left.first < right.first 
       merged << left.shift 
      else 
       merged << right.shift 
       inversions += left.size 
      end 
     end 

     merged += left += right 
     [inversions, merged] 
    end 
end 

p [*1..20].shuffle.inversions 

我試着用

def inversions 
    result = self.send(:count_and_sort) 
    result[0] 
end 

更換倒置但結果是一樣的。

PS任何其他批評和評論歡迎)

+1

你能發佈確切的錯誤輸出嗎? – tessi

+0

main.rb:20:在'count_and_sort'中:要求[9,6,4,1,12,14,16,15,5,3]的私有方法'count_and_sort':Array(NoMethodError) \t from main。 rb:4:'inversions' \t from main.rb:44:'

' – Konstantin

回答

2

的誤差是count_and_sort方法內,作爲錯誤信息表示:

... in 'count_and_sort': private method 'count_and_sort' called for ... 

錯誤的行是:

left = left.count_and_sort 
right = right.count_and_sort 

Ruby中的私有方法不能用明確的接收方調用,它們必須在012上隱式調用。因此,您可以使count_and_sort方法受到保護,或使用leftright上的send對其進行調用。在這種情況下,我會建議前者。

+0

關於這個話題的不錯的博文。 http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

太好了,非常感謝! 'left = left.send(:count_and_sort)' 'right = right.send(:count_and_sort)' 完美地工作。 – Konstantin