Компаратор как параметр для конструктора класса - PullRequest
0 голосов
/ 08 февраля 2020

Кажется, я нигде не могу точно найти, как это сделать. Я пишу класс, который принимает компаратор в качестве параметра / аргумента для конструктора класса. Я хочу использовать это для заказа элементов в списке. Но я не уверен, что делать с компаратором в новом классе.

  • Я импортировал java.util.Comparator
  • В объявлении класса я сказал "impements Comparator<T>"
  • Я написал (Comparator<T> c) в качестве аргумента для конструктора класса.

Я никогда не использовал компаратор таким образом - я использовал его как внутренний класс, и это так, поэтому я не уверен, как заставить метод сравнения работать в этом классе, когда я беру компаратор в качестве аргумента для конструктора.

Единственное, что я сделал, - это три маркированных пункта выше. Каждый раз, когда я пытаюсь что-то сделать с компаратором, который я принимаю в качестве аргумента, я получаю сообщение об ошибке.

Вот код для конструктора:

public class SortedList<T> implements Comparator<T>
    //value, position and array are instance variables
    //I am switching array to a List to deal with generics
    private int position;
    private Integer[] array;

    public SortedList(Comparator<T> c){
       this.position = 0;
       this.array = new Integer[25];
    }

    public void sort(Integer num){
       boolean valid = false;
       int i = 0;

       while(!valid && i < array.length-1){
          if(num.compareTo(array[i] > 0)){
            array[i+1] = array[i];
            array[i] = num;
          }else{
            i++;
       }
    }

У меня есть сообщения об ошибках были получены следующие данные:

  • Не удается найти символ - метод compareTo

Я хотел бы иметь возможность сравнивать любые два объекта, а не только целые числа, поэтому я хотел возьмите компаратор в качестве параметра.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Из вашего вопроса не ясно, но единственная конструкция collection-i sh в вашем фрагменте - это массив целочисленных объектов. Таким образом, единственная разумная вещь для сортировки здесь - это массив.

Вам понадобится Comparator<Integer>, чтобы отсортировать это, а не Comparator<T>.

Как только вы это сделаете, для сортировки этот массив, все, что вам нужно сделать, это ..

Arrays.sort(array, c);
1 голос
/ 09 февраля 2020

Ваш класс SortedList<T> не должен реализовывать интерфейс Comparator<T>, поскольку этот класс не используется для сравнения объектов. Однако он будет использовать данный экземпляр Comparator<T> для сортировки своих записей. Это означает, что классы и методы должны иметь следующие определения:

public class SortedList<T> {
     // ...
}

Класс больше не реализует интерфейс Comparator<T>.

private T[] array;

Поле array должно иметь тип T[], поскольку этот SortedList<T> объект используется для сортировки / хранения объектов типа T, а не Integer объектов.

public SortedList(Comparator<T> c){
    // ...
    this.comparator = c;
}

Это верно. Конструктор получает экземпляр Comparator<T>. Вам следует сохранить эту ссылку в поле, чтобы позже вы могли использовать ее в своем методе sort().

public void sort(){
    // ...
}

Аргумент Integer в методе sort() не имеет никакого смысла, поэтому удалите Это. Теперь вы можете использовать сохраненный экземпляр Comparator<T> в вашем методе sort() и вызвать его метод compare() для сравнения двух объектов из вашего сохраненного массива. Фрагмент кода может выглядеть так:

// ...
if (this.comparator.compare(this.array[i], this.array[i+1])) {
    // it should be on the left
} else {
    // it should be on the right
}
// ...
...