Menu
CoddyTech

group_by dan partition

Termasuk bagian Logika dan Alur dalam perjalanan Ruby di Coddy. Pelajaran 25 dari 56.

Terkadang kamu ingin memisahkan koleksi alih-alih memfilternya. Dua method mencakup sebagian besar kasus.

group_by menerima sebuah blok dan mengembalikan hash. Setiap hasil blok yang unik menjadi kunci, yang memetakan ke array elemen-elemen yang menghasilkannya:

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

Ini cara paling rapi untuk mengelompokkan item dalam satu kali proses.

partition adalah versi biner: ini mengembalikan sepasang array, elemen yang bloknya bernilai true, dan sisanya:

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

Gunakan partition jika ada tepat dua kelompok, group_by jika kelompoknya bisa banyak.

challenge icon

Tantangan

Sedang

Baca daftar entri name:score yang dipisahkan koma (misalnya Alice:88,Bob:42,Charlie:75). Gunakan group_by lalu partition untuk membuat laporan singkat.

Langkah-langkah:

  1. Urai setiap entri menjadi pasangan [name, score] (score adalah bilangan bulat)
  2. Kelompokkan pasangan berdasarkan huruf pertama name (huruf besar) menggunakan group_by
  3. Untuk setiap kelompok huruf, urutkan secara alfabetis, lalu gunakan partition untuk membagi entri menjadi lulus (score >= 60) dan gagal, lalu cetak satu baris untuk setiap kelompok:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

Dalam setiap kelompok, nama muncul sesuai urutan aslinya. Jika salah satu sisi tidak memiliki nama, biarkan kosong (misalnya fail=).

Untuk input Alice:88,Adam:42,Bob:75,Beth:55,Cara:90, output-nya adalah:

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

Coba sendiri

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

# TODO: kelompokkan berdasarkan huruf pertama (huruf besar), lalu pisahkan setiap kelompok berdasarkan score >= 60,
#       cetak 'X: pass=... fail=...' dalam urutan huruf alfabetis
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Ruby online