group_by ve partition
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 25 / 56.
Bazen bir koleksiyonu filtrelemek yerine split etmek (bölmek) istersiniz. İki yöntem çoğu durumu kapsar.
group_by bir blok alır ve bir hash döndürür. Her benzersiz blok sonucu, kendisini üreten öğelerin bir dizisine eşlenen bir anahtar haline gelir:
words = ["hi", "hello", "yo", "hey", "bonjour"]
by_length = words.group_by { |w| w.length }
puts by_length.inspect
# {2=>["hi", "yo"], 5=>["hello"], 3=>["hey"], 7=>["bonjour"]}Tek bir geçişte öğeleri gruplamanın en temiz yoludur.
partition ikili sürümdür: bloğun true döndürdüğü elemanlar ile geri kalanlardan oluşan bir dizi çifti döndürür:
evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect # [2, 4]
puts odds.inspect # [1, 3, 5]Tam olarak iki kova olduğunda partition, çok sayıda olabildiğinde ise group_by kullanın.
Görev
OrtaVirgülle ayrılmış name:score girdilerinden oluşan bir liste okuyun (ör. Alice:88,Bob:42,Charlie:75). Küçük bir rapor oluşturmak için group_by ve ardından partition kullanın.
Adımlar:
- Her girdiyi bir
[name, score]çiftine dönüştürün (score bir tamsayıdır) - Çiftin
namedeğerinin ilk harfine (büyük harf) göregroup_byuygulayın - Her harf grubu için, alfabeye göre sıralı (
alphabetical) olarak, girdileri geçenler (score >= 60) ve kalanlar olarakpartitionyöntemiyle ayırın, ardından her grup için bir satır yazdırın:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>Her grup içinde isimler orijinal sıralarıyla görünür. Bir tarafta hiç isim yoksa, o kısmı boş bırakın (ör. fail=).
Alice:88,Adam:42,Bob:75,Beth:55,Cara:90 girdisi için çıktı şu şekildedir:
A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=Kendin dene
entries = gets.chomp.split(",").map do |s|
name, score = s.split(":")
[name, score.to_i]
end
# TODO: ilk harfe göre grupla (büyük), her grubu score >= 60'a göre ayır,
# alfabetik harf sırasıyla 'X: pass=... fail=...' 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ıKendi başına pratik yap: Online Ruby derleyicisi