2009-06-24 4 views
1

J'ai recherché/googlé autour, mais je suis aux prises avec le problème suivant.LocalJumpError (Ruby on Rails)

Je construis une application Rails 2.3.2 et l'une des exigences est de calculer la médiane d'un tableau de résultats. J'utilise du code pour calculer la médiane à partir du livre de recettes Ruby mais je continue à rencontrer un problème avec la réception d'une erreur 'LocalJumpError - aucun bloc donné' lorsque j'essaie de trouver la médiane d'un tableau contenant un nombre impair de membres.

Le code exemple à mon avis est la suivante:

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

ensuite dans le modèle survey_response.rb les méthodes sont les suivantes:

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 

L'erreur est provoquée lorsque la méthode médiane renvoie à la méthode moyenne pour obtenir le média d'un total impair d'éléments dans le tableau. Je n'arrive pas à comprendre pourquoi je reçois cette erreur ou même comment y remédier - alors j'apprécierais énormément toute aide/conseil/rire que n'importe qui pourrait m'offrir!

Merci

Simon

Répondre

1

Lis semble que ce soit en raison de vous en utilisant un indice fractionnaire dans le tableau. Essayez de remplacer:

m_pos = array.size/2 

avec:

m_pos = (array.size/2) .ceil

Aussi, essayez de changer votre fonction moyenne à ceci:

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

Hey merci de répondre - malheureusement, cela ne fait aucune différence. Je reçois toujours la même erreur lorsqu'il y a un nombre impair d'éléments dans le tableau. Y a-t-il d'autres informations que je peux fournir qui pourraient être utiles? – simonyoung

+0

Merci - avec la fonction edit to the mean() cela fonctionne également un régal. – simonyoung

1

Code mieux :

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

Hey J'ajouté: chiffres = numbers.sort car le tableau a besoin de tri avant de trouver la médiane, mais il est certainement autrement fixé mon problème. Merci beaucoup! – simonyoung

1

Cela mean méthode semble horriblement bâclée. Essayez ceci:

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

Merci - en remplaçant la méthode mean() avec votre alternative a également résolu le problème et me donne une méthode mean() pour une utilisation ailleurs aussi. – simonyoung

+0

Ha ha. Son probablement rien mais M.Matt a édité son poste bon 20 minutes après que j'ai pointé l'erreur réelle dans le code original et ai copié ma correction de la méthode 'mean' dans son édition. –

+0

Sauf que j'ai fait ce changement 4 minutes avant de poster votre réponse. – Codebeef