Сравнителен компаратор Java

Ето моя код

class ComparableTest
{
    public static void main(String[] args)
    {
        BOX[] box = new BOX[5];
        box[0] = new BOX(10,8,6); 
        box[1] = new BOX(5,10,5);
        box[2] = new BOX(8,8,8);
        box[3] = new BOX(10,20,30);
        box[4] = new BOX(1,2,3);
        Arrays.sort(box);
        for(int i=0;i<box.length;i++)
            System.out.println(box[i]);
    }
}

Също така имам клас BOX, който прилага Comparable. Сега имам няколко въпроса, с които бих искал всички да ми помогнете.

1. Декларирани ли са методите в сравнимия интерфейс, дефинирана ли е системата, като мога ли да имам някакъв метод в сравнимия или трябва да е само compareTo?

2.Не предоставих внедряването на метода Arrays.sort, как тогава сортира моите елементи?

3. Когато използвам Comparator вместо comparable, тогава използвам:

class comparatorTest
{
    public static void main(String args[])
    {
        Student[] students = new Student[5];
        Student[0] = new Student(“John”,”2000A1Ps234”,23,”Pilani”);
        Student[1] = new Student(“Meera”,”2001A1Ps234”,23,”Pilani”);
        Student[2] = new Student(“Kamal”,”2001A1Ps344”,23,”Pilani”);
        Student[3] = new Student(“Ram”,”2000A2Ps644”,23,”Pilani”);
        Student[4] = new Student(“Sham”,”2000A7Ps543”,23,”Pilani”);    
        // Sort By Name
        Comparator c1 = new studentbyname();
        Arrays.sort(students,c1);
        for(int i=0;i<students.length;i++)
            System.out.println(students[i]);
    }
}

//В горния код, studentbyname implements comparator, но кутията все още прилага comparable .т.е

class studentbyname implements comparator
{
    public int compare(Object o1,Object o2)
    {  
        Student s1 = (Student) o1;
        Student s2 = (Student) o2;
        return s1.getName().compareTo(s2.getName());
    }
}

Сега правя Arrays.sort(students,c1), защо предавам c1 сега?


person Kraken    schedule 21.09.2011    source източник
comment
Нямате основни познания за това как полиморфизмът, наследяването и претоварването на методите работят в java. Потърсете ги първо и ще разберете защо: трябва да имплементирате compareTo, можете да подадете различен брой аргументи към това, което изглежда е един и същ метод.   -  person Shivan Dragon    schedule 21.09.2011
comment
Можете да се обърнете към digizol.com/2008/07/java -sorting-comparator-vs-comparable.html   -  person lkamal    schedule 06.11.2013


Отговори (3)


  1. За да изпълните договора за Сравнимо, трябва да имате поне метода сравни с. Може да имате колкото искате методи за добавяне във вашия клас.

  2. Той сортира елементите в естествения ред въз основа на Сравнимия интерфейс. Така че sort извиква compareTo между елементите, за да види в кой ред да ги постави.

  3. Осигуряването на Comparator към метода за сортиране позволява на sort да подрежда елементи, които или (a) не прилагат Comparable или (b) където искате да ги подредите в друг ред, различен от "естествения ред", както е дефиниран от изпълнението на Comparable на класа.

Когато подадете Comparator за сортиране, той извиква метода за сравнение на Comparator, а не метода compareTo на елементите (ако е внедрен).

вижте Какво е интерфейс

вижте Comparator

вижте Сравнимо

person John B    schedule 21.09.2011
comment
така че Comparable е като, не знам какъв би бил правилният термин, но „системно дефиниран“, тоест трябва да съдържа compareTo нали? - person Kraken; 21.09.2011
comment
Comparable е интерфейс, което означава, че дефинира набор от методи, които трябва да бъдат имплементирани от всеки клас, който твърди, че имплементира интерфейса. - person John B; 21.09.2011
comment
и какво се случва, когато предам 'c' заедно с масива за сортиране? - person Kraken; 21.09.2011
comment
така че мога да имам всеки интерфейс, нали? мога да направя нов интерфейс, да речем публичен интерфейс abc{ //методи }; не трябва да предоставям конкретен метод там, защо се случва с comparable, че трябва да предоставя compareTo в него. Това някакъв стандартизиран интерфейс ли е? - person Kraken; 21.09.2011
comment
Да, можете да дефинирате всеки интерфейс, който искате, с произволен набор от методи. И да, Comparable е вече дефиниран системен интерфейс. Вижте моите връзки. - person John B; 21.09.2011
comment
така че когато внедрявам компаратор, тогава моят клас BOX не трябва да внедрява сравнимия интерфейс, тъй като основата за сравнение ще бъде предоставена само от компаратора? - person Kraken; 21.09.2011
comment
Като цяло изпълнението на Comparator не би използвало изпълнение на Comparable на класове. Какъв би бил смисълът, тъй като те ще доведат до същия ред и предаването на Comparator за сортиране не е задължително. Повечето реализации на Comparator използват различен механизъм за сравнение, за да подредят елементите на клас. Обикновено използва гетери за извличане на полета от класа, върху които да се базира сравнението. - person John B; 21.09.2011

  1. Можете да дефинирате колкото искате методи в Comparable, стига да внедрите compareTo. Този метод може да се използва в много ситуации, когато класът се проверява за сравнение. Например, когато вмъквате екземпляри в подреден TreeSet. compareTo предоставя общо правило за подреждане за всички екземпляри на класа.
  2. Arrays.sort подрежда масива в естествения ред на неговите елементи. Тоест, използвайки compareTo.
  3. Можете да използвате Comparator, за да дефинирате персонализирано правило за подреждане. Както когато имате таблица, можете да сортирате по всяка от нейните колони. Бихте могли да дефинирате Comparator за всяка от неговите колони и пак можете да имате присъщо на класа правило за подреждане (както във връзка с реалността, която класът представлява), дефинирано в класа compareTo.
person Xavi López    schedule 21.09.2011

Внедряването на Comparable ви задължава да предоставите внедряване за compareTo() .

Всички елементи в масива Object, предадени на Arrays.sort(Object[]) методът трябва да имплементира Сравнимо. Ако искате вместо това да използвате компаратор, трябва да използвате Arrays.sort() метод, който приема Comparator като параметър. Методът, който използвате във вашия пример по-горе, приема Comparator като втори параметър - оттук и необходимостта да предоставите c1 в извикването на метода.

person Brandon E Taylor    schedule 21.09.2011