Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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 عندما يكون هناك العديد من المجموعات.

challenge icon

التحدي

متوسط

اقرأ قائمة مفصولة بفاصلة من مدخلات name:score (على سبيل المثال Alice:88,Bob:42,Charlie:75). استخدم group_by متبوعة بـ partition لإنشاء تقرير صغير.

الخطوات:

  1. حلل كل إدخال إلى زوج [name, score] (بحيث تكون النتيجة عددًا صحيحًا)
  2. استخدم group_by بحسب الحرف الأول من name للزوج (بحرف كبير)
  3. لكل مجموعة أحرف، بترتيب أبجدي (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=...' بترتيب الحروف الأبجدي
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق العمليات

تدرّب بنفسك: مترجم Ruby عبر الإنترنت