لماذا يرمي هذا التعليمات البرمجية وكيفية تجنب ذلك

StackOverflow https://stackoverflow.com/questions/1173789

  •  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 في القائمة).

تنفذ الفصل المقارنة، غير قابلة للمقارنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top