Instantané d'inventaire
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 55 sur 56.
Un rapport d'inventaire qui met en pratique les hashes, les chaînes Enumerable, group_by, et une touche de mise en forme.
Défi
MoyenLe tableau inventory est fourni. Chaque élément est un hash avec :name, :category, :qty, et :price.
Affichez quatre lignes :
- La valeur totale de l'inventaire pour tous les articles (
qty * price, additionnés), affichée sous forme d'entier. - La catégorie ayant le plus grand nombre d'articles, au format
Top category: <name> (<count>). En cas d'égalité, l'ordre alphabétique du nom de la catégorie prévaut. - Les noms des articles out of stock (
qty == 0), triés par ordre alphabétique, joints par,. Si aucun, affichez(none). - Les noms des 3 articles les plus chers par prix unitaire, du plus cher au moins cher, joints par
,. En cas d'égalité, l'ordre alphabétique du nom prévaut.
Pour l'inventaire par défaut, la sortie est :
232
Top category: food (3)
milk
chair, lamp, milkAide-mémoire
Travailler avec des tableaux de hashs en utilisant les méthodes Enumerable :
# Somme avec calcul par élément
inventory.sum { |item| item[:qty] * item[:price] }
# Grouper par une clé et compter
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }
# Filtrer, trier et joindre
inventory.select { |item| item[:qty] == 0 }
.map { |item| item[:name] }
.sort
.join(", ")
# Trier par plusieurs critères (les égalités sont départagées par ordre alphabétique)
inventory.sort_by { |item| [-item[:price], item[:name]] }
.first(3)
.map { |item| item[:name] }
.join(", ")
Départager les égalités par ordre alphabétique lors de l'utilisation de max_by avec des comptes :
# Le compte le plus élevé l'emporte ; en cas d'égalité, le premier par ordre alphabétique (négation pour max_by)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# Ou utiliser min_by sur le compte négatif + l'ordre naturel des chaînes
groups.sort_by { |cat, items| [-items.count, cat] }.first
Essayez vous-même
inventory = [
{ name: "apple", category: "food", qty: 10, price: 2 },
{ name: "bread", category: "food", qty: 4, price: 3 },
{ name: "milk", category: "food", qty: 0, price: 4 },
{ name: "chair", category: "furniture", qty: 2, price: 35 },
{ name: "lamp", category: "furniture", qty: 5, price: 20 },
{ name: "pencil", category: "stationery", qty: 30, price: 1 }
]
# TODO: afficher la valeur totale, la catégorie principale, les noms en rupture de stock, le top 3 par prix
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 - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline