2010-07-01 13 views
9

Dire que j'ai un tableau d'entiers:Ruby: Numéro Arrondir au numéro le plus proche en fonction de la liste arbitraire des numéros

arr = [0,5,7,8,11,16] 

et j'ai un autre entier:

n = 6 

je besoin d'une fonction arrondit au nombre le plus proche du tableau:

foo(n) #=> 5 

Comme vous pouvez le voir, les nombres n'ont pas de motif fixe. Quelle est une manière élégante de faire ceci?

Merci

+2

Bien sûr, votre instruction n = 6.5 ne définit pas un entier. Je suppose que c'est une faute de frappe de votre part. –

+0

oui ma mauvaise. Je décidais si je voulais poser des questions sur les flotteurs/fixnums, etc et je suis allé pour ce qui comptait vraiment, ce qui était l'algorithme. – user94154

Répondre

14

utilisation select Suivie par max:

arr = [0,5,7,8,11,16] 
puts arr.select{|item| item < 6}.max 

Résultat:

5 

Cela va dans le temps linéaire et ne nécessite pas que le tableau est trié.

+2

belle. une des raisons pour lesquelles j'aime Ruby. Merci beaucoup! – user94154

1

Si vous utilisez des tableaux relativement petits (et donc pas trop inquiet sur l'efficacité), cela devrait fonctionner correctement:

def down_to_array num, arr 
    arr.select{|y| y < num}.sort_by{|z| num-z }.first 
end 

Par exemple:

myarr = [0,5,7,8,11,16] 
puts down_to_array 6.5, myarr #=> 5 
+0

Bonne réponse. Je voudrais juste ajouter ce lien http://ruby-doc.org/core/classes/Enumerable.html#M003120 qui est comment vous pouvez exécuter un benchmark sur sort_by pour vérifier si c'est une bonne solution avec vos tableaux. – dierre