Menu
Coddy logo textTech

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.

challenge icon

Défi

Moyen

Le tableau inventory est fourni. Chaque élément est un hash avec :name, :category, :qty, et :price.

Affichez quatre lignes :

  1. La valeur totale de l'inventaire pour tous les articles (qty * price, additionnés), affichée sous forme d'entier.
  2. 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.
  3. Les noms des articles out of stock (qty == 0), triés par ordre alphabétique, joints par , . Si aucun, affichez (none).
  4. 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, milk

Aide-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
quiz iconTestez-vous

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