Veri Dönüştürücü
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 56 / 56.
Bitirme projesi meydan okuması: bir veri kümesini özet bir rapora dönüştürün. Filtreleme, eşleme, gruplandırma, hata yönetimi ve metot tanımlamayı tek bir programda birleştirin.
Görev
Ortastudents dizisi verilmiştir. Her girdi; :id, :grades (tamsayılardan oluşan, boş olabilen bir dizi) ve :subjects (dizgelerden oluşan bir dizi) anahtarlarını içeren bir hash yapısıdır.
İki anahtar içeren bir hash döndüren transform_dataset(students) metodunu tanımlayın:
:qualified_ids: En az bir notu olan ve tüm notları kesinlikle70değerinin üzerinde olan (all?kullanın) öğrencilerin:id'lerinden oluşan sıralı dizi.:subject_counts: Kalifiye olan öğrencilerin aldığı her bir dersi, o dersi alan kalifiye öğrenci sayısıyla eşleştiren bir hash.
Eğer bir öğrencinin :grades dizisi boşsa, bu öğrenci kalifiye değildir, sessizce atlayın.
Ardından metodu çağırın ve şunları yazdırın:
Qualified:önekiyle birlikte, aralarına,konularak birleştirilmiş kalifiye ID'ler. Eğer hiç yoksa,Qualified: (none)yazdırın.- Her ders için (alfabetik olarak sıralanmış)
<subject>: <count>formatında bir satır.
Varsayılan students verisi için çıktı şöyledir:
Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1Kopya kağıdı
Ruby'de filtreleme, eşleme (mapping), gruplama ve çıktı biçimlendirmeyi birleştirin:
def transform_dataset(students)
qualified = students.select do |s|
s[:grades].any? && s[:grades].all? { |g| g > 70 }
end
qualified_ids = qualified.map { |s| s[:id] }.sort
subject_counts = Hash.new(0)
qualified.each do |s|
s[:subjects].each { |subj| subject_counts[subj] += 1 }
end
{ qualified_ids: qualified_ids, subject_counts: subject_counts }
end
Sonuçları varsayılan değer (fallback) ve sıralanmış anahtarlarla yazdırın:
result = transform_dataset(students)
ids = result[:qualified_ids]
puts "Qualified: #{ids.any? ? ids.join(', ') : '(none)'}"
result[:subject_counts].sort.each do |subject, count|
puts "#{subject}: #{count}"
end
all?boş dizilerdefalsedöndürür — boş notlara karşı korunmak için önceany?kullanın.Hash.new(0)eksik anahtarları0ile başlatır, bu sayma işlemleri için kullanışlıdır.- Bir hash üzerinde
.sortkullanımı, alfabetik olarak sıralanmış[key, value]çiftleri döndürür.
Kendin dene
students = [
{ id: "S1", grades: [85, 92, 78], subjects: ["math", "physics"] },
{ id: "S2", grades: [65, 80, 90], subjects: ["math", "biology"] },
{ id: "S3", grades: [], subjects: ["art"] },
{ id: "S4", grades: [88, 95], subjects: ["math", "biology", "history"] },
{ id: "S5", grades: [70, 75], subjects: ["chemistry"] }
]
# YAPILACAK: def transform_dataset(students), { qualified_ids:, subject_counts: } döndür
# YAPILACAK: nitelikli kimlikleri (ID'leri) ve ders sayılarını 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ı