Menu
Coddy logo textTech

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.

challenge icon

Görev

Orta

Virgü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:

  1. Her girişi bir [name, score] çiftine ayrıştırın (score bir tam sayıdır)
  2. Çiftin name değerinin ilk harfine göre (büyük harf) group_by uygulayın
  3. Her harf grubu için, alfabetik sırayla, girişleri geçenler (score >= 60) ve kalanlar olarak partition ile 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
quiz iconKendini test et

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