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 bölmek istersiniz. Çoğu durumu iki yöntem 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ış bir name:score girdi listesi 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 ayrıştırın (score bir tam sayıdır) - Çiftin
group_bydeğerinin ilk harfine (büyük harf) görenameuygulayın - Her harf grubu için, alfabetik sırayla, girdileri geçen (
partition) ve kalan olarakscore >= 60ile ayırın, ardından grup başına bir satır yazdırın:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>Her grup içinde adlar, özgün sıralarında görünür. Bir tarafta hiç ad yoksa, onu boş bırakın (ör. fail=).
Alice:88,Adam:42,Bob:75,Beth:55,Cara:90 girdisi için çıktı şöyledir:
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
1Dizeler Detaylı İnceleme
Dize Metotlarına Genel BakışDize EnterpolasyonuDizeler Üzerinde YinelemeBölme ve BirleştirmeTekrar - Dize Dokuyucu4Bloklar, Proc'lar ve Lambda'lar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar SözcüğüBlok ParametreleriProc'lar ve Lambda'larÖzet - Özel Yineleyici7Hash'ler 2. Bölüm
Varsayılanlarla Hash.newHash'ler Üzerinde Yinelemeİç İçe Hash'lerBirleştirme ve DönüştürmeTekrar - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Seçme ve ReddetmeMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byTekrar - Veri HattıKendi başına pratik yap: Online Ruby derleyicisi