logo

ממשק Java Comparator

ממשק Java Comparator משמש לסדר האובייקטים של מחלקה המוגדרת על ידי המשתמש.

ממשק זה נמצא בחבילת java.util ומכיל 2 שיטות compare(Object obj1,Object obj2) ו-equals(Object element).

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

שיטות של ממשק Java Comparator

שיטהתיאור
public int compare(Object obj1, Object obj2)זה משווה את האובייקט הראשון עם האובייקט השני.
ציבורי בוליאני שווה (Object obj)הוא משמש להשוואת האובייקט הנוכחי עם האובייקט שצוין.
ציבורי בוליאני שווה (Object obj)הוא משמש להשוואת האובייקט הנוכחי עם האובייקט שצוין.

שיעור אוספים

אוספים class מספקת שיטות סטטיות למיון האלמנטים של אוסף. אם רכיבי האוסף הם של Set או Map, נוכל להשתמש ב-TreeSet או ב-TreeMap. עם זאת, איננו יכולים למיין את האלמנטים של רשימה. מחלקה Collections מספקת גם שיטות למיון האלמנטים של אלמנטים מסוג List.

מחלקה שיטת אוספים למיון רכיבי רשימה

מיון void public (רשימת רשימה, Comparator c): משמש למיון האלמנטים של רשימה לפי המשווה הנתון.


דוגמה להשוואת Java (סגנון ישן לא גנרי)

בואו נראה את הדוגמה של מיון האלמנטים של List על בסיס גיל ושם. בדוגמה זו, יצרנו 4 מחלקות Java:

  1. Student.java
  2. AgeComparator.java
  3. NameComparator.java
  4. Simple.java
Student.java

מחלקה זו מכילה שלושה שדות rollno, שם וגיל ובנאי בעל פרמטרים.

 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java

מחלקה זו מגדירה לוגיקה של השוואה על סמך הגיל. אם הגיל של האובייקט הראשון גדול מהשני, אנו מחזירים ערך חיובי. זה יכול להיות כל אחד כמו 1, 2, 10. אם הגיל של האובייקט הראשון קטן מהאובייקט השני, אנחנו מחזירים ערך שלילי, זה יכול להיות כל ערך שלילי, ואם הגיל של שני העצמים שווה, אנחנו מחזירים 0.

 import java.util.*; class AgeComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
NameComparator.java

מחלקה זו מספקת היגיון השוואה המבוסס על השם. במקרה כזה, אנו משתמשים בשיטת compareTo() של המחלקה String, אשר מספקת באופן פנימי את לוגיקת ההשוואה.

 import java.util.*; class NameComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; return s1.name.compareTo(s2.name); } } 
Simple.java

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

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); Iterator itr=al.iterator(); while(itr.hasNext()){ Student st=(Student)itr.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); Iterator itr2=al.iterator(); while(itr2.hasNext()){ Student st=(Student)itr2.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

דוגמה להשוואת Java (גנרית)

Student.java
 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java
 import java.util.*; class AgeComparator implements Comparator{ public int compare(Student s1,Student s2){ if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
NameComparator.java

מחלקה זו מספקת היגיון השוואה המבוסס על השם. במקרה כזה, אנו משתמשים בשיטת compareTo() של המחלקה String, אשר מספקת באופן פנימי את לוגיקת ההשוואה.

 import java.util.*; class NameComparator implements Comparator{ public int compare(Student s1,Student s2){ return s1.name.compareTo(s2.name); } } 
Simple.java

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

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

ממשק Java 8 Comparator

ממשק Java 8 Comparator הוא ממשק פונקציונלי המכיל רק שיטה מופשטת אחת. כעת, אנו יכולים להשתמש בממשק Comparator כיעד ההקצאה עבור ביטוי למבדה או התייחסות לשיטה.

שיטות של ממשק השוואת Java 8

שיטהתיאור
int compare(T o1, T o2)הוא משווה את האובייקט הראשון לאובייקט השני.
סטָטִיהשוואת משווה (מחלץ מפתח פונקציות)הוא מקבל פונקציה המחלצת מפתח מיון Comparable מסוג T, ומחזירה Comparator שמשווה לפי מפתח המיון הזה.
השוואת משווה סטטית (מחלץ מפתח פונקציות, משווה מפתח משווה)הוא מקבל פונקציה המחלצת מפתח מיון מסוג T, ומחזירה Comparator שמשווה לפי מפתח המיון הזה באמצעות המשווה שצוין.
Comparator static comparingDouble(ToDoubleFunction keyExtractor)הוא מקבל פונקציה המחלצת מפתח מיון כפול מסוג T, ומחזירה Comparator שמשווה לפי מפתח המיון הזה.
Comparator static comparingInt(ToIntFunction keyExtractor)הוא מקבל פונקציה המחלצת מפתח מיון int מסוג T, ומחזירה Comparator שמשווה לפי מפתח המיון הזה.
Comparator static comparingLong(ToLongFunction keyExtractor)הוא מקבל פונקציה המחלצת מפתח מיון ארוך מסוג T, ומחזירה Comparator שמשווה לפי מפתח המיון הזה.
בוליאני שווה (Object obj)הוא משמש להשוואת האובייקט הנוכחי עם האובייקט שצוין.
סטָטִיComparator naturalOrder()זה מחזיר משווה שמשווה אובייקטים ניתנים להשוואה בסדר טבעי.
Static Comparator nullsFirst(Comparator Comparator)היא מחזירה משווה שמתייחס ל-null להיות פחות מאלמנטים שאינם אפס.
Static Comparator nullsLast(Comparator Comparator)היא מחזירה משווה שמתייחס ל-null להיות גדול יותר מאלמנטים שאינם אפס.
ברירת המחדל Comparator reversed()הוא מחזיר משווה שמכיל סדר הפוך של המשווה שסופק.
סטָטִיComparator reverseOrder()היא מחזירה משווה שמכילה סדר הפוך מהסדר הטבעי.
ברירת המחדל Comparator thenComparing(Comparator אחר)היא מחזירה משווה מסדר לקסיקוגרפי עם משווה אחר.
בְּרִירַת מֶחדָלComparator thenComparing(Function keyExtractor)הוא מחזיר משווה מסדר לקסיקוגרפי עם פונקציה המחלצת מפתח מיון Comparable.
ברירת המחדל Comparator thenComparing(מפתח פונקציהExtractor, Comparator keyComparator)הוא מחזיר משווה מסדר לקסיקוגרפי עם פונקציה המחלצת מפתח שיש להשוות עם המשווה הנתון.
ברירת המחדל Comparator thenComparingDouble(ToDoubleFunction keyExtractor)הוא מחזיר משווה מסדר לקסיקוגרפי עם פונקציה המחלצת מפתח מיון כפול.
ברירת המחדל Comparator thenComparingInt(ToIntFunction keyExtractor)הוא מחזיר משווה מסדר לקסיקוגרפי עם פונקציה המחלצת מפתח מיון int.
ברירת המחדל Comparator thenComparingLong(ToLongFunction keyExtractor)הוא מחזיר השוואת סדר לקסיקוגרפי עם פונקציה המחלצת מפתח מיון ארוך.

דוגמה להשוואה של Java 8

בואו נראה את הדוגמה של מיון האלמנטים של רשימה על בסיס גיל ושם.

קובץ: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

קובץ: TestSort1.java

 import java.util.*; public class TestSort1{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); //Sorting elements on the basis of name Comparator cm1=Comparator.comparing(Student::getName); Collections.sort(al,cm1); System.out.println('Sorting by Name'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } //Sorting elements on the basis of age Comparator cm2=Comparator.comparing(Student::getAge); Collections.sort(al,cm2); System.out.println('Sorting by Age'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by Age 105 Jai 21 101 Vijay 23 106 Ajay 27 

דוגמה להשוואה של Java 8: שיטת nullsFirst() ו-nullsLast().

כאן, אנו ממיינים את רשימת האלמנטים המכילה גם null.

קובץ: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

קובץ: TestSort2.java

 import java.util.*; public class TestSort2{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,null,21)); Comparator cm1=Comparator.comparing(Student::getName,Comparator.nullsFirst(String::compareTo)); Collections.sort(al,cm1); System.out.println('Considers null to be less than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } Comparator cm2=Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)); Collections.sort(al,cm2); System.out.println('Considers null to be greater than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Considers null to be less than non-null 105 null 21 106 Ajay 27 101 Vijay 23 Considers null to be greater than non-null 106 Ajay 27 101 Vijay 23 105 null 21