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 ayırmak 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 bir anahtar haline gelir ve bu sonucu üreten öğelerden oluşan bir diziye eşlenir:
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"]}Öğeleri tek geçişte gruplandırmanın en temiz yolu budur.
partition ikili (binary) versiyondur: bir dizi çifti döndürür; bloğun doğru olduğu öğeler ve geri kalanı:
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 grup (bucket) olduğunda partition, birçok grup olabildiğinde ise group_by kullanın.
Görev
OrtaVirgülle ayrılmış name:score girişlerinden oluşan bir listeyi okuyun (örneğin 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 girişi bir
[name, score]çiftine ayrıştırın (score bir tam sayıdır) - Çiftin
namedeğerinin ilk harfine göre (büyük harf)group_byuygulayın - Her harf grubu için, alfabetik sırayla, girişleri geçenler (
score >= 60) ve kalanlar olarakpartitionile 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ında görünür. Bir tarafın ismi yoksa, orayı boş bırakın (örneğin fail=).
Alice:88,Adam:42,Bob:75,Beth:55,Cara:90 girişi için çıktı şöyledir:
A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=Kopya kağıdı
group_by bir koleksiyonu blok sonucuna göre anahtarlanmış bir hash'e böler:
words = ["hi", "hello", "yo"]
by_length = words.group_by { |w| w.length }
# {2=>["hi", "yo"], 5=>["hello"]}partition tam olarak iki diziye (eşleşen ve eşleşmeyen) böler:
evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
# evens => [2, 4], odds => [1, 3, 5]İki grup için partition, daha fazlası için group_by kullanın.
Kendin dene
entries = gets.chomp.split(",").map do |s|
name, score = s.split(":")
[name, score.to_i]
end
# YAPILACAKLAR: ilk harfe göre gruplandır (büyük harf), her grubu puan >= 60 durumuna göre böl,
# alfabetik harf sırasına göre '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ı