Menu
Coddy logo textTech

group_by et partition

Fait partie de la section Logique et Flux du Journey Ruby de Coddy. Leçon 25 sur 56.

Parfois, vous souhaitez diviser une collection plutôt que de la filtrer. Deux méthodes couvrent la plupart des cas.

group_by prend un bloc et renvoie un hash. Chaque résultat de bloc unique devient une clé, associée à un tableau des éléments qui l'ont produit :

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

C'est la façon la plus propre de regrouper des éléments en une seule passe.

partition est la version binaire : elle retourne une paire de tableaux, les éléments pour lesquels le bloc était vrai, et le reste :

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

Utilisez partition lorsqu'il y a exactement deux catégories, et group_by lorsqu'il peut y en avoir plusieurs.

challenge icon

Défi

Moyen

Lisez une liste séparée par des virgules d'entrées name:score (ex. Alice:88,Bob:42,Charlie:75). Utilisez group_by suivi de partition pour produire un court rapport.

Étapes :

  1. Parsez chaque entrée en une paire [name, score] (le score est un entier)
  2. Regroupez avec group_by selon la première lettre du name (en majuscule)
  3. Pour chaque groupe de lettre, par ordre alphabetical, divisez avec partition les entries en réussite (score >= 60) et échec, puis affichez une ligne par group :
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

Au sein de chaque group, les names apparaissent dans leur order d'origine. Si un côté n'a pas de names, laissez-le vide (ex. fail=).

Pour l'entrée Alice:88,Adam:42,Bob:75,Beth:55,Cara:90, le result attendu est :

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

Essayez vous-même

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

# TODO: grouper par première lettre (majuscule), partitionner chaque groupe par score >= 60,
#       afficher 'X: pass=... fail=...' dans l'ordre alphabétique des lettres
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux

Entraînez-vous par vous-même : Compilateur Ruby en ligne