group_by ו־partition
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Ruby של Coddy. שיעור 25 מתוך 56.
לפעמים רוצים לפצל אוסף במקום לסנן אותו. שתי שיטות מכסות את רוב המקרים.
המתודה group_by מקבלת בלוק ומחזירה גיבוב. כל תוצאה ייחודית של הבלוק הופכת למפתח, שממפה למערך של האיברים שהפיקו אותה:
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"]}זו הדרך הנקייה ביותר לקבץ פריטים במעבר אחד.
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](הציון הוא מספר שלם) - קבץ לפי האות הראשונה של
nameשבזוג (באותיות גדולות) באמצעותgroup_by - עבור כל קבוצת אותיות, לפי סדר אלפביתי, חלק את הערכים באמצעות
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: לקבץ לפי האות הראשונה (גדולה), לחלק כל קבוצה לפי score >= 60,
# להדפיס 'X: pass=... fail=...' לפי סדר אלפביתי של האותיות
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
סקירה של מתודות למחרוזותאינטרפולציה של מחרוזותמעבר על מחרוזותפיצול וחיבורסיכום – שוזר המחרוזות4בלוקים, Procs ו־Lambdas
מהו בלוק?do..end לעומת סוגריים מסולסליםמילת המפתח yieldפרמטרים של בלוקProcs ו־Lambdasסיכום – איטרטור מותאם אישית7Hashes חלק 2
Hash.new עם ערכי ברירת מחדלמעבר על HashesHashes מקונניםמיזוג ושינויסיכום - מונה תדירויות10פרויקט - רשומות תלמידים
סקירת הפרויקטהוספת תלמיד5עוצמת Enumerable
Select ו־Rejectשרשור MapReduce / Injectcount, all?, any?, none?group_by ו־partitionsort_by, min_by, max_byסיכום - צינור נתוניםתרגלו בעצמכם: קומפיילר Ruby אונליין