2009-06-24 203 views
1

我已经搜索/谷歌搜索,但我正在努力解决以下问题。LocalJumpError(Ruby on Rails)

我正在构建一个Rails 2.3.2应用程序,其中一个要求是计算结果数组的中值。我正在使用代码来计算Ruby Cookbook的中位数,但当我尝试查找有奇数个成员的数组的中位数时,仍然遇到接收错误“LocalJumpError - 没有给出任何代码块”的错误问题。

在我的视图的示例代码如下:

<%= survey_response.median([6,4,5,4,4,2]) %> 

然后在survey_response.rb模型的方法如下:

def mean(array) 
    array.inject(array.inject(0) { |sum, x| sum += x }/array.size.to_f) 
end 

def median(array,already_sorted=false) 
    return nil if array.empty? 
    array = array.sort unless already_sorted 
    m_pos = array.size/2 
    return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos])  
end 

时中值方法是指后面的误差引起到平均的方法来获得数组中奇数项目的媒体。我无法弄清楚为什么我会遇到这样的错误,或者确实如何解决这个问题 - 所以我非常感谢任何人可以给我提供的任何帮助/指导/大笑!

感谢

西蒙

回答

1

李氏看起来是由于您使用分数指数在数组中。尝试更换:

m_pos = array.size/2 

有:

m_pos =(array.size/2).ceil

此外,尝试改变你的平均函数将此:

def mean(array) 
    array.inject(0) { |sum, x| sum += x }/array.size.to_f 
end 
+0

嘿谢谢回复 - 不幸的是,没有什么区别。当数组中有奇数个项目时,仍然会出现相同的错误。有没有我可以提供的其他信息可能有用? – simonyoung 2009-06-24 09:08:18

+0

谢谢 - 通过编辑mean()函数,这也是一种享受。 – simonyoung 2009-06-24 09:35:28

1

更好的代码:

def mean(array) 
    array.inject { |sum, n| sum + n }/array.length.to_f 
end 

def median(array) 
    return nil if array.empty? 
    array.sort! 
    middle = array.length/2 
    (array.length % 2 == 1) ? array[middle] : mean([array[middle-1], array[middle]]) 
end 

puts median([5,11,12,4,8,21]) # => 9.5 
+0

嘿 我说: 数= numbers.sort ,因为你会发现中间前阵需要排序,但它肯定另有固定我的问题。非常感谢! – simonyoung 2009-06-24 09:25:03

1

那个mean方法看起来非常糟糕。试试这个:

 
def mean(array) 
    a.inject(0) { |sum,x| sum += x }/a.size.to_f 
end