group_by و partition
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy. الدرس 25 من 56.
في بعض الأحيان قد ترغب في تقسيم مجموعة بدلاً من تصفيتها. هناك طريقتان تغطيان معظم الحالات.
تأخذ group_by كتلًا برمجية (block) وترجع تجزئة (hash). يصبح كل ناتج فريد للكتلة البرمجية مفتاحًا، والذي يرتبط بمصفوفة من العناصر التي أنتجته:
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"]}إنها الطريقة الأكثر وضوحاً لتجميع العناصر في خضوع واحد (pass).
تُعدّ partition النسخة الثنائية: فهي تُرجع زوجًا من المصفوفات، العناصر التي كانت كتلة الكود معها صحيحة (true)، والبقية:
evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect # [2, 4]
puts odds.inspect # [1, 3, 5]استخدم partition عندما يكون هناك مجموعتان بالضبط، و group_by عندما يكون هناك العديد من المجموعات.
التحدي
متوسطاقرأ قائمة مفصولة بفاصلة من مدخلات name:score (على سبيل المثال Alice:88,Bob:42,Charlie:75). استخدم group_by متبوعة بـ partition لإنشاء تقرير صغير.
الخطوات:
- حلل كل إدخال إلى زوج
[name, score](بحيث تكون النتيجة عددًا صحيحًا) - استخدم
group_byبحسب الحرف الأول منnameللزوج (بحرف كبير) - لكل مجموعة أحرف، بترتيب أبجدي (
alphabetical)، قم بـpartitionللمدخلات إلى ناجح (score >= 60) وراسب، ثم اطبع سطرًا واحدًا لكل مجموعة:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>ضمن كل مجموعة، تظهر الأسماء بترتيبها الأصلي. إذا لم يحتوي أي جانب على أسماء، اتركه فارغًا (على سبيل المثال fail=).
بالنسبة للمدخلات Alice:88,Adam:42,Bob:75,Beth:55,Cara:90، تكون المخرجات:
A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=جرّب بنفسك
entries = gets.chomp.split(",").map do |s|
name, score = s.split(":")
[name, score.to_i]
end
# TODO: جمّع حسب الحرف الأول (كبير)، قسّم كل مجموعة حسب الدرجة >= 60،
# اطبع 'X: pass=... fail=...' بترتيب الحروف الأبجدي
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على دوال السلاسل النصيةتضمين النصوص (String Interpolation)التكرار عبر السلاسل النصيةالتقسيم والربط (Split و Join)مراجعة - نساج النصوص4Blocks و Procs و Lambdas
ما هو الـ Block؟do..end مقابل الأقواس { }الكلمة المفتاحية yieldمعاملات الـ BlockProcs و Lambdasمراجعة - Custom Iterator مخصص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر الـ Hashesالـ Hashes المتداخلةالدمج والتحويلمراجعة - عداد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة الـ Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - Data Pipelineتدرّب بنفسك: مترجم Ruby عبر الإنترنت