Menu
Coddy logo textTech

group_by e partition

Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 25 di 56.

A volte vuoi suddividere una raccolta invece di filtrarla. Due metodi coprono la maggior parte dei casi.

group_by accetta un blocco e restituisce un hash. Ogni risultato univoco del blocco diventa una chiave, associata a un array degli elementi che lo hanno prodotto:

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"]}

È il modo più pulito per raggruppare gli elementi in un solo passaggio.

partition è la versione binaria: restituisce una coppia di array, gli elementi per cui il blocco è risultato vero e il resto:

evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect   # [2, 4]
puts odds.inspect    # [1, 3, 5]

Usa partition quando ci sono esattamente due gruppi, group_by quando possono essercene molti.

challenge icon

Sfida

Medio

Leggi un elenco di voci name:score separate da virgole (ad es. Alice:88,Bob:42,Charlie:75). Usa group_by seguito da partition per produrre un breve resoconto.

Passaggi:

  1. Analizza ogni voce in una coppia [name, score] (score è un intero)
  2. Raggruppa con group_by in base alla prima lettera di name (maiuscola)
  3. Per ogni gruppo di lettere, in ordine alfabetico, usa partition per suddividere le voci in promossi (score >= 60) e bocciati, quindi stampa una riga per gruppo:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

All'interno di ogni gruppo, i nomi compaiono nell'ordine originale. Se un lato non contiene nomi, lascialo vuoto (ad es. fail=).

Per l'input Alice:88,Adam:42,Bob:75,Beth:55,Cara:90, l'output è:

A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=

Provalo tu

entries = gets.chomp.split(",").map do |s|
  name, score = s.split(":")
  [name, score.to_i]
end

# TODO: raggruppa per prima lettera (maiuscola), suddividi ogni gruppo in base a score >= 60,
#       stampa 'X: pass=... fail=...' in ordine alfabetico delle lettere
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Ruby online