sort_by, min_by, max_by
Fait partie de la section Logique et flux du Journey Ruby de Coddy. Leçon 26 sur 56.
Vous connaissez déjà sort, min et max. Les versions _by vous permettent de contrôler ce qu'il faut comparer, ce qui est idéal pour trier des données structurées.
sort_by prend un bloc ; le bloc renvoie la valeur à comparer pour chaque élément :
words = ["banana", "hi", "hello"]
by_length = words.sort_by { |w| w.length }
puts by_length.inspect # ["hi", "hello", "banana"]Pour un ordre décroissant, inversez la clé de comparaison, -w.length pour les nombres, ou appelez reverse sur le résultat.
min_by et max_by retournent l'élément unique ayant la valeur la plus petite / la plus grande du bloc :
people = [
{ name: "Ada", age: 36 },
{ name: "Bob", age: 22 },
{ name: "Cara", age: 41 }
]
youngest = people.min_by { |p| p[:age] }
oldest = people.max_by { |p| p[:age] }
puts youngest[:name] # Bob
puts oldest[:name] # CaraLa syntaxe abrégée fonctionne également : words.sort_by(&:length).
Défi
MoyenLe tableau products est fourni, chaque élément étant un hash avec :name, :price, et :quantity. La valeur du stock de chaque produit est price * quantity.
Affichez trois lignes :
- Les noms triés par valeur de stock décroissante, joints par
,(utilisezsort_bysur la valeur dérivée) - Le nom du produit ayant la quantité la plus élevée parmi les articles dont le prix est inférieur à 5 (utilisez
max_bysur une liste filtrée) - Le nom du produit le moins cher dont la quantité est d'au moins 10 (utilisez
min_bysur une liste filtrée)
Pour le tableau par défaut, la sortie est :
cheese, milk, bread, apple
bread
breadEssayez vous-même
products = [
{ name: "milk", price: 3, quantity: 8 },
{ name: "apple", price: 1, quantity: 4 },
{ name: "cheese", price: 5, quantity: 6 },
{ name: "bread", price: 2, quantity: 12 }
]
# TODO: trier par valeur de stock décroissante ; max par quantité (prix < 5) ; min par prix (quantité >= 10)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et flux
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - Tisseur de chaînes4Blocs, Procs et Lambdas
Qu'est-ce qu'un bloc ?do..end ou accoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes, 2e partie
Hash.new avec valeurs par défautParcourir les hashesHashes imbriquésFusionner et transformerRécapitulatif - Compteur de fréquences10Projet - Dossiers des étudiants
Présentation du projetAjouter un étudiant2Plages
Qu’est-ce qu’une plage ?Méthodes des plagesPlages dans Case / WhenRécapitulatif - Exercices sur les plages5Puissance des Enumerable
Select et RejectChaînage de MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Pipeline de donnéesEntraînez-vous par vous-même : Compilateur Ruby en ligne