Menu
Coddy logo textTech

הממשק Comparator

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 45 מתוך 87.

בעוד ש-Comparable מגדיר את הסדר הטבעי של מחלקה, לפעמים צריך למיין אובייקטים בדרכים שונות. הממשק Comparator מאפשר ליצור לוגיקת השוואה נפרדת בלי לשנות את המחלקה המקורית.

Comparator הוא אובייקט חיצוני שמשווה בין שני אובייקטים מאותו סוג. זה שימושי כשאתה רוצה כמה אפשרויות מיון או כשאינך יכול לשנות את המחלקה עצמה:

import java.util.Comparator;

class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

לאחר מכן אפשר להעביר את המשווה למתודות מיון:

List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));

Collections.sort(people, new NameComparator());  // ממוין לפי שם
Collections.sort(people, new AgeComparator());   // ממוין לפי גיל

כדי לכתוב קוד תמציתי, אפשר להשתמש בביטויי lambda, מכיוון ש־Comparator הוא ממשק פונקציונלי:

Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));

ההבדל העיקרי: המחלקה שמשווים אותה מממשת את Comparable ומגדירה סדר טבעי אחד, ואילו Comparator היא מחלקה נפרדת שיכולה להגדיר מספר בלתי מוגבל של סדרים מותאמים אישית.

challenge icon

אתגר

קל

בואו נבנה מערכת למיון עובדים שמדגימה את העוצמה של הממשק Comparator. תיצרו כמה משווים כדי למיין עובדים בדרכים שונות — לפי שכר ולפי שם — בלי לשנות את המחלקה Employee עצמה.

תארגנו את הקוד שלכם בארבעה קבצים:

  • Employee.java: צרו מחלקה שמייצגת עובד עם שלושה שדות פרטיים: name (String), department (String) ו-salary (double). כללו בנאי לאתחול כל השדות ומתודות getter עבור כל אחד מהם. דרסו את toString() כך שתחזיר: [name] ([department]) - $[salary]
  • SalaryComparator.java: צרו משווה שממיין עובדים לפי שכר בסדר יורד (המשכורת הגבוהה ביותר תחילה). ממשו את הממשק Comparator<Employee> ואת המתודה compare() שלו. השתמשו ב-Double.compare() להשוואה בטוחה של ערכי השכר.
  • NameComparator.java: צרו משווה נוסף שממיין עובדים לפי שם בסדר אלפביתי, בסדר עולה (מא' עד ת'). ממשו את Comparator<Employee> והשתמשו במתודת compareTo() של String לצורך ההשוואה.
  • Main.java: חברו את כל החלקים יחד על ידי יצירת רשימת עובדים ומיונם באמצעות המשווים שלכם. תקבלו קלט עבור שלושה עובדים, כל אחד בשורה נפרדת, בפורמט: name,department,salary

    צרו ArrayList של עובדים, ואז הדגימו את שתי שיטות המיון:

    1. תחילה, מיינו לפי שכר באמצעות SalaryComparator שלכם והדפיסו כל עובד
    2. הדפיסו שורה ריקה
    3. לאחר מכן, מיינו לפי שם באמצעות NameComparator שלכם והדפיסו כל עובד

תקבלו שלוש שורות קלט, שכל אחת מהן מכילה נתוני עובד בפורמט: name,department,salary

לדוגמה, שורת קלט עשויה להיראות כך: Alice,Engineering,75000.0

זכרו לייבא את java.util.Comparator בקובצי המשווים שלכם, ואת java.util.ArrayList, java.util.Collections ו-java.util.Scanner בקובץ Main שלכם. שימו לב כיצד משווים מאפשרים לכם להגדיר כמה אסטרטגיות מיון באופן חיצוני: מחלקת Employee לא צריכה לדעת דבר על האופן שבו אפשר למיין אותה!

נסו בעצמכם

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קראו שלושה עובדים מהקלט
        // הפורמט של כל שורה: name,department,salary
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: נתחו כל שורה וצרו אובייקטים מסוג Employee
        // רמז: השתמשו ב־split(",") כדי להפריד בין הערכים
        
        // TODO: צרו ArrayList של עובדים והוסיפו אליו את שלושתם
        
        // TODO: מיינו לפי שכר באמצעות SalaryComparator והדפיסו כל עובד
        // רמז: השתמשו ב־Collections.sort(list, comparator)
        
        // TODO: הדפיסו שורה ריקה
        
        // TODO: מיינו לפי שם באמצעות NameComparator והדפיסו כל עובד
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין