Сравнительный компаратор 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, но box все еще реализует 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), почему я сейчас прохожу с1?


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. Чтобы соответствовать контракту Comparable, у вас должен быть как минимум метод compareTo. В вашем классе может быть столько методов сложения, сколько вам нужно.

  2. Он сортирует элементы в естественном порядке на основе интерфейса Comparable. Таким образом, sort вызывает compareTo между элементами, чтобы увидеть, в каком порядке их размещать.

  3. Предоставление Comparator методу sort позволяет sort упорядочивать элементы, которые либо (а) не реализуют Comparable, либо (б) там, где вы хотите чтобы упорядочить их в порядке, отличном от «естественного порядка», определенного реализацией класса Comparable.

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

см. Что такое интерфейс

см. Компаратор

см. Сопоставимые

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
так что я могу иметь любой интерфейс не так ли? я могу создать новый интерфейс, скажем, public interface abc{//methods}; мне не нужно указывать там конкретный метод, почему это происходит с сопоставимым, что я должен предоставить в нем 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 используют другой механизм сравнения для упорядочения элементов класса. Обычно он использует геттеры для извлечения полей из класса, на котором основывается сравнение. - 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[]) должен реализовывать Comparable. Если вместо этого вы хотите использовать компаратор, вы должны использовать Arrays.sort(), который принимает Comparator в качестве параметра. Метод, который вы используете в приведенном выше примере, принимает Comparator в качестве второго параметра, поэтому необходимо указать c1 в вызове метода.

person Brandon E Taylor    schedule 21.09.2011