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.
Tantangan
SedangBaca 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:
- Urai setiap entri menjadi pasangan
[name, score](score adalah bilangan bulat) - Kelompokkan pasangan berdasarkan huruf pertama
name(huruf besar) menggunakangroup_by - Untuk setiap kelompok huruf, urutkan secara alfabetis, lalu gunakan
partitionuntuk 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami String
Ringkasan Method StringInterpolasi StringMenelusuri StringMemisahkan dan MenggabungkanRekap: Perangkai String4Block, Proc, dan Lambda
Apa Itu Block?do..end vs Kurung KurawalKata Kunci yieldParameter BlockProc dan LambdaRangkuman, Iterator Kustom5Andalan Enumerable
Select dan RejectMerangkai MapReduce / Injectcount, all?, any?, none?group_by dan partitionsort_by, min_by, max_byRekap: Alur Data8Pengambilan Keputusan Lanjutan
Case dengan class & regexwhen dengan Banyak NilaiOperator Ternaryif / unless SebarisUlasan, Pengklasifikasi NilaiLatihan sendiri: Compiler Ruby online