فرز صفيفقائمة الكائنات مع قابلة للمقارنة والمقارنة

في هذا البرنامج التعليمي ، سنرى كيفية فرز ArrayList الذي يحتوي على كائنات باستخدام الواجهتين java.lang.Comparable و java.util.Compartor. إذا كان برنامجك يتطلب فرز ArrayList of String أو عدد صحيح ، فمن الأفضل مراجعة هاتين المقالتين:

- Sort a String or Integer ArrayList
- فرز قائمة صفيف بترتيب تنازلي< / a >

يتم استخدام واجهة المقارنة عندما تريد فرز قائمة من الكائنات عن طريق مقارنة كائنين بالطريقة المحددة مسبقا object1.compareTo(object2).

فرز قائمة صفيف باستخدام Comparable

أولا ، دعنا نرى نتيجة الفرز لقائمة صفيف الكائنات دون تنفيذ واجهة قابلة للمقارنة.

دعنا ننشئ فئة Employe.java:

< / div>
 موظف من الفئة العامة {

اسم سلسلة خاص ؛
العمر الدولي الخاص ؛ < br / > راتب طويل خاص ؛

اسم إرجاع السلسلة العامة getName () {
؛
}

int getAge العام () {
سن العودة ؛
}

الحصول على راتب عام طويل () {
راتب عائد ؛
}

موظف عام (اسم السلسلة ، العمر الدولي ، الراتب int) {
this.name = الاسم ؛
this.age = العمر ؛
this.salary = الراتب ؛
}

@Override
// تعرض هذه الطريقة معلومات الموظف
سلسلة عامة toString () {
إرجاع "[name =" + this.name "، العمر =" + this.age + "، الراتب =" +
this.salary + "]" ؛
}
}
< / pre>< / div>
نريد إنشاء قائمة ArrayList< الموظف>:

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

الفئة العامة ArrayListComparable {

الفراغ العام الثابت الرئيسي (سلسلة [] args) {
ArrayList< الموظف> arraylist = ArrayList جديد< الموظف> ();
arraylist.add (موظف جديد ("ماتيو"، 32، 20000))؛
arraylist.add (موظف جديد ("كاتيا" ، 26 ، 10000)) ؛
arraylist.add (موظف جديد ("aline" ، 30 ، 40000)) ؛
arraylist.add (موظف جديد ("سالم" ، 28 ، 35000)) ؛

System.out.println ("قائمة الموظفين المطلوبة:\n"+Collections.sort(arraylist));
}
}
< / pre>استدعاء نمط Collections.sort() في حدوث مشكلة لأنه يتم على ArrayList من الكائنات التي لا تعمل إلا إذا كنت تستخدم كل من واجهات المقارنة والمقارنة. يظهر خطأ في التجميع:

< pre class = "prettyprint lang-java" > استثناء في مؤشر الترابط java.lang.Error "الرئيسي": مشاكل التحويل البرمجي التي لم يتم حلها:
عامل التشغيل + غير معرف لنوع (أنواع) الوسيطة سلسلة ، باطل < br / > عدم تطابق منضم: لا ينطبق فرز الطريقة العامة (List) لمجموعات النوع على الوسيطات (ArrayList). النوع المستنبط Employe ليس بديلا صالحا للمعلمة المحدودة >

في ArrayListComparable.main(ArrayListComparable.java:14)

الآن يجب أن تكون قد فهمت أهمية هاتين الواجهتين.

لنفترض أننا نريد فرز القائمة حسب العقار: راتب الموظف. يمكن القيام بذلك عن طريق تنفيذ واجهة قابلة للمقارنة ، ثم تقوم جافا بإجراء مقارنة تلقائية مع compareTo()declared Override.

بعد تنفيذ واجهة قابلة للمقارنة في فئة Employe.java ، تكون النتيجة كما يلي:

 public class Employe ينفذ قابلة للمقارنة< الموظف> {

اسم سلسلة خاص;
العمر الدولي الخاص ؛ < br / > راتب طويل خاص ؛

اسم إرجاع السلسلة العامة getName () {
؛
}

int getAge العام () {
سن العودة ؛
}

الحصول على راتب عام طويل () {
راتب عائد ؛
}

موظف عام (اسم السلسلة ، العمر الدولي ، الراتب int) {
this.name = الاسم ؛
this.age = العمر ؛
this.salary = الراتب ؛
}

@Override
// تعرض هذه الطريقة معلومات الموظف
سلسلة عامة toString () {
إرجاع "[name =" + this.name "، العمر =" + this.age + "، الراتب =" +
this.salary + "]" ؛
}

@Override
int compareTo العام (موظف emp) {
// فرز الموظفين حسب العمر بالترتيب croiddant
// retroune عدد صحيح سالب أو صفري أو موجب إذا كان عمر
// لهذا الموظف أقل من أو يساوي أو أكبر من الكائن مقارنة ب
return (this.age - emp.age) ؛
}
}
< / pre>الآن لدينا الحق في استدعاء الطريقة Collections.sort():

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

الفئة العامة ArrayListComparable {

الفراغ العام الثابت الرئيسي (سلسلة [] args) {
ArrayList< الموظف> arraylist = ArrayList جديد< الموظف> ();

arraylist.add (موظف جديد ("ماتيو"، 32، 20000))؛
arraylist.add (موظف جديد ("كاتيا" ، 26 ، 10000)) ؛
arraylist.add (موظف جديد ("aline" ، 30 ، 40000)) ؛
arraylist.add (موظف جديد ("سالم" ، 28 ، 35000)) ؛

Collections.sort (arraylist) ؛

System.out.println ("قائمة مرتبة بالموظفين حسب العمر:\n");
ل (الموظف e: arraylist)
System.out.println (e) ؛
}
}
< / pre>عندما نقوم بتشغيل هذا الجزء من التعليمات البرمجية ، سنحصل على النتيجة التالية:

قائمة الموظفين المرتبة حسب العمر: 

[الاسم = كاتيا ، العمر = 26 ، الراتب = 10000]
[الاسم = سليم ، العمر = 28 ، الراتب = 35000] < br / > [الاسم = ألين ، العمر = 30 ، الراتب = 40000]
[الاسم = ماتيو ، العمر = 32 ، الراتب = 20000]
< / pre>

فرز قائمة صفيف باستخدام Compartor< / h2>كما ترى ، يتم فرز قائمة الموظفين أعلاه بترتيب تصاعدي. ولكن لماذا استخدام واجهة المقارنة إذن؟ لأنه قد تكون هناك مواقف يعتمد فيها الفرز على عدة معلمات على عكس المقارنة. على سبيل المثال ، نريد أن يعتمد فرز الموظفين على الاسم والعمر والراتب.

The قارن (الكائن o1 ، الكائن o2) < / امتداد> لواجهة المقارنة يأخذ كائنين. في مثالنا ، يجب تنفيذه ثلاث مرات (الاسم والعمر والراتب) بحيث يرجع عددا صحيحا سالبا إذا كانت الوسيطة الأولى أصغر من الثانية وصفرا إذا كانت متساوية وعدد صحيح موجب إذا كانت الوسيطة الأولى أكبر من الثانية.

import java.util.Compartor; 

موظف فئة عامة {

اسم سلسلة خاص ؛
العمر الدولي الخاص ؛ < br / > راتب طويل خاص ؛

سلسلة عامة getNom () {
اسم الإرجاع ؛
}

int getAge العام () {
سن العودة ؛
}

الحصول على راتب عام طويل () {
راتب عائد ؛
}

موظف عام (اسم السلسلة ، العمر الدولي ، الراتب int) {
this.name = الاسم ؛
this.age = العمر ؛
this.salary = الراتب ؛
}

@Override
// تعرض هذه الطريقة معلومات الموظف
سلسلة عامة toString () {
إرجاع "[name =" + this.name "، العمر =" + this.age + "، الراتب =" +
this.salary + "]" ؛
}

/*
* مقارنة لفرز الموظفين حسب الاسم
* /
مقارنة ثابتة عامة< الموظف> اسم المقارنة = مقارنة جديدة< الموظف> () {

@Override
int compare (الموظف e1, الموظف e2) {
إرجاع e1.getName().compareTo(e2.getName());
}
} ؛
/*
* مقارنة لفرز الموظفين حسب العمر
*/
مقارنة ثابتة عامة< الموظف> CompartorAge = مقارنة جديدة< الموظف> () {

@Override
مقارنة int العامة (الموظف e1، الموظف e2) {
return (int) (e1.getAge() - e2.getAge())؛
}
} ؛
/*
* مقارنة لفرز الموظفين حسب الراتب
* /
مقارنة ثابتة عامة< الموظف> راتب المقارنة= مقارنة جديدة< الموظف> () {

@Override
مقارنة int العامة (الموظف e1، الموظف e2) {
return (int) (e1.getSalary() - e2.getSalary())؛
}
} ؛
}
فئة الاختبار الرئيسية:

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

الفئة العامة الرئيسية {

الفراغ الثابت العام الرئيسي (سلسلة [] args) {
ArrayList< الموظف> arraylist = ArrayList جديد< الموظف> ();

arraylist.add (موظف جديد ("ماتيو"، 32، 20000))؛
arraylist.add (موظف جديد ("كاتيا" ، 26 ، 10000)) ؛
arraylist.add (موظف جديد ("aline" ، 30 ، 40000)) ؛
arraylist.add (موظف جديد ("سالم" ، 28 ، 35000)) ؛

// sort by name
Collections.sort (arraylist ، Employee.CompartorName) ؛

System.out.println ("قائمة مرتبة بالموظفين بالاسم:");
ل (الموظف e: arraylist)
System.out.println (e) ؛

// فرز حسب العمر
Collections.sort (قائمة الصفيف ، الموظف.المقارنة) ؛

System.out.println ("قائمة مرتبة بالموظفين حسب العمر:");
ل (الموظف e: arraylist)
System.out.println (e) ؛

// فرز حسب الراتب
Collections.sort (قائمة الصفيف ، الموظف ، الراتب المقارن) ؛

System.out.println ("قائمة مرتبة بالموظفين حسب الراتب:");
ل (الموظف e: arraylist)
System.out.println (e) ؛
}
}
< / pre> يعطي تنفيذ هذا الرمز:

قائمة مرتبة للموظفين بالاسم: 
[الاسم = ألين ، العمر = 30 ، الراتب = 40000] < br / > [الاسم = كاتيا ، العمر = 26 ، الراتب = 10000]
[الاسم = ماتيو ، العمر = 32 ، الراتب = 20000] < br / > [الاسم = سليم ، العمر = 28 ، الراتب = 35000]
للموظفين حسب العمر:
[name = كاتيا ، العمر = 26 ، الراتب = 10000]
[الاسم = سليم ، العمر = 28 ، الراتب = 35000]
[الاسم = ألين ، العمر = 30 ، الراتب = 40000]
[الاسم = ماتيو ، العمر = 32 ، الراتب = 20000]
قائمة مرتبة للموظفين حسب الراتب:
[name = كاتيا ، العمر = 26 ، الراتب = 10000]
[الاسم = ماتيو ، العمر = 32 ، الراتب = 20000]
[الاسم = سليم ، العمر = 28 ، الراتب = 35000]
[الاسم = ألين ، العمر = 30 ، الراتب = 40000] < / قبل >< / div>