لماذا يرمي هذا التعليمات البرمجية وكيفية تجنب ذلك
-
19-09-2019 - |
سؤال
النظر في هذا الرمز:
import java.util.*;
class jm45 implements Comparator<jm45>
{
private int x;
jm45(int input) { x = input; }
public static void main( String args[] )
{
List list = new ArrayList();
list.add(new jm45(2));
list.add(new jm45(2));
Collections.sort(list); //faulty line
}
public int compare( jm45 t1 , jm45 t2 )
{
return t1.x - t2.x;
}
}
المحلول
تنفذ الفصل الخاص بك Comparator<jm45>
بدلاً من Comparable<jm45>
.
أ Comparator
يعرف كيفية مقارنة كائنين - أ Comparable
يعرف كيفية قارن آخر مع نفسه.
إما تحتاج إلى المرور في المقارنة ل sort()
لاستخدام (كما الحجة الثانية) أو يجب أن تكون القيم قابلة للمقارنة.
إليك نسخة تستخدم Comparable
واجهة بدلا من ذلك:
import java.util.*;
class Test implements Comparable<Test>
{
private int x;
Test(int input)
{
x = input;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list);
}
public int compareTo(Test other)
{
return x - other.x;
}
}
وهنا نسخة تستخدم Comparator
واجهه المستخدم:
import java.util.*;
class TestComparator implements Comparator<Test>
{
public int compare(Test t1, Test t2)
{
return t1.getX() - t2.getX();
}
}
class Test
{
private int x;
Test(int input)
{
x = input;
}
int getX()
{
return x;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list, new TestComparator());
}
}
لا يوجد شيء ل قف تنفيذ فئة. Comparator<T>
لنفسه، لكن الأمر غريبا بعض الشيء للقيام بذلك. على سبيل المثال، لن تطلب عادة سلسلة واحدة لمقارنة اثنين آخرين مع بعضها البعض - لا علاقة له بالسلسلة الأصلية نفسها.
نصائح أخرى
من المجموعات.
فرز القائمة المحددة في ترتيب تصاعدي، وفقا للترتيب الطبيعي لعناصرها. يجب أن تنفذ جميع العناصر في القائمة واجهة مماثلة. وبعد علاوة على ذلك، يجب أن تكون جميع العناصر في القائمة مماثلة بشكل متبادل (أي أن E1.Compareto (E2) يجب ألا يتم إلقاء ككلاسكاستكس في أي عناصر E1 و E2 في القائمة).
تنفذ الفصل المقارنة، غير قابلة للمقارنة.