J'ai une gamme de tableaux, de types d'objets variables et je souhaite extraire les tableaux du tableau de matrices si la somme des non entiers multiplié par deux est supérieure ou égale à la somme de l'ensemble de la matrice. Par exemple: comme la somme des cordes et des flotteurs sont supérieurs ou égaux à la somme des entiers. P> p>
3 Réponses :
Vous pouvez utiliser:
Array # Sélectionnez CODE> < / a> pour extraire les tableaux basés sur une condition li>
-
énumérable # grep_v code> < / a> pour extraire des non-entiers li>
-
Array # Somme code> < / a> Pour calculer les sommes (en utilisant to_f code> pour la conversion) li>
ul> xxx pré> Vous pouvez également passer le to_f code> -call vers grep_v code>, c'est-à-dire ary.grep_v (INTEGER, &: to_f) .sum code> mais je préfère avoir des code> identiques code> -Calls des deux côtés. p> p>
Considérant que ary.grep_v (INTEGER) .Sum (&: to_f) = ary.sum (&: to_f) - ary.grep (INTEGER) .Sum code>, il peut être plus efficace (en partie en partie sur la proportion de valeurs entières) pour écrire 2 * ary.grep (entier) .sum <= ary.sum (&: to_f) code>, bien que je ne pense pas que ce soit aussi clair ( Mais il évite que le lecteur réponde à la question: "Qu'est-ce que diable est grep_v code>?").
Créer un Lambda pour multiplier l'objet appelé. Nous devons convertir des chaînes aux flotteurs en tant que chaîne peut représenter entier ou flotteur.
elements.select { |arr| arr.grep_v(Integer, &multiply).sum >= arr.map(&:to_f).reduce(:+) }
Je pense que la Lambda pourrait raisonnablement être réduite à -> (x) {x.to_f * 2} code> suivant le principe de typage du canard de Ruby. En ce moment, si vous dites éléments code> contenus [[[[[[[[[[[[[[[[CODE> THE GREP_V CODE> collecterait le sous-réseau, puis Multiplier code> aboutirait à [12,12] cependant en ajoutant le message code> to_f code> une erreur serait soulevée qui semble plus conforme à l'intention du processus. Ou peut-être plus verbauly -> (x) {x.to_r.to_f * 2} code> pour gérer string code> site "1/2"
Correction à mon commentaire précédent multiplier code> aboutirait à ["1", 2, "1", 2] code>
a = elements[0]
#=> [1, 2, "3", "4"]
ints, non_ints = a.partition { |e| e.is_a? Integer }
#=> [[1, 2], ["3", "4"]]
a = elements[1]
# => [1, "2", "3", 5]
ints, non_ints = a.partition { |e| e.is_a? Integer }
#=> [[1, 5], ["2", "3"]]