Envanter Anlık Görüntüsü
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 55 / 56.
Hash'leri, Enumerable zincirlerini, group_by metodunu ve biraz biçimlendirmeyi kullanan bir envanter raporu.
Görev
Ortainventory dizisi verilmiştir. Her öğe :name, :category, :qty ve :price anahtarlarını içeren bir hash yapısıdır.
Dört satır yazdırın:
- Tüm öğelerdeki toplam envanter değeri (
qty * pricetoplamı), tam sayı olarak yazdırılmalıdır. - En fazla öğe sayısına sahip kategori,
Top category: <name> (<count>)formatında yazdırılmalıdır. Eşitlik durumunda kategori adına göre alfabetik olarak öncelik verilir. - Stokta kalmayan (
qty == 0) öğelerin adları, alfabetik olarak sıralanmış ve,ile birleştirilmiş şekilde yazdırılmalıdır. Eğer hiç yoksa,(none)yazdırın. - Birim fiyatına göre en pahalı ilk 3 öğenin adı, en yüksekten başlayarak
,ile birleştirilmiş şekilde yazdırılmalıdır. Eşitlik durumunda isme göre alfabetik olarak sıralanmalıdır.
Varsayılan envanter için çıktı şöyledir:
232
Top category: food (3)
milk
chair, lamp, milkKopya kağıdı
Enumerable metotlarını kullanarak hash dizileriyle çalışma:
# Eleman başına hesaplama ile toplama
inventory.sum { |item| item[:qty] * item[:price] }
# Bir anahtara göre gruplandırma ve sayma
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }
# Filtreleme, sıralama ve birleştirme
inventory.select { |item| item[:qty] == 0 }
.map { |item| item[:name] }
.sort
.join(", ")
# Birden fazla kritere göre sıralama (eşitlik durumunda alfabetik)
inventory.sort_by { |item| [-item[:price], item[:name]] }
.first(3)
.map { |item| item[:name] }
.join(", ")
Sayım ile max_by kullanırken eşitlikleri alfabetik olarak bozma:
# Daha yüksek sayı kazanır; eşitlik durumunda, alfabetik olarak ilk (max_by için dizeyi tersine çevirin)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# Veya negatif sayı + doğal dize sırası üzerinde min_by kullanın
groups.sort_by { |cat, items| [-items.count, cat] }.first
Kendin dene
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: toplam değeri, en popüler kategoriyi, stokta olmayan isimleri ve fiyata göre ilk 3'ü yazdır
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Derinlemesine Stringler
String Metotlarına Genel BakışString InterpolationStringler Üzerinde GezinmeSplit ve JoinÖzet - String Weaver4Bloklar, Procs ve Lambdalar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar KelimesiBlok ParametreleriProcs ve LambdalarÖzet - Özel İteratör7Hashes Bölüm 2
Varsayılan Değerlerle Hash.newHash Yapıları Üzerinde Yinelemeİç İçe Hash YapılarıBirleştirme ve DönüştürmeÖzet - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Select ve RejectMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byÖzet - Data Pipeline8İleri Seviye Karar Yapıları
Sınıflar ve Regex ile CaseÇok Değerli whenTernary OperatörüSatır İçi if / unlessÖzet - Not Sınıflandırıcı