Запутался в реализации compareTo с PriorityQueue

Я пытаюсь написать программу, в которой я копирую офис регистратора, используя приоритетную очередь. Сортировка для этой очереди приоритетов будет основываться на более высоком GPA, который будет обслуживаться первым и т. д. Я создал программу, которая делает это с моей собственной реализацией, но я просто не понимаю, как реализовать мой метод compareTo.

//Create Priority Queue
PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, compareTo());

Сначала я сделал свою приоритетную очередь. Согласно документации, я могу указать, что я должен использовать для своих сравнений, compareTo().

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

private Comparator<? super Student> compareTo(Student x, Student y) {
}

Он говорит мне, что «compareTo в BursarOfficeJavaService не может быть применен к ()», и моя IDE предлагает удалить мои параметры. Но я не понимаю, как я могу делать сравнения без объектов для сравнения?

Мой единственный другой метод в классе — это reciveEvent, который в основном просто определяет, удаляю ли я из очереди или добавляю в очередь. Данные по событию — это студенческий объект, с которым я могу сравнить, но я просто не понимаю, как собрать все это вместе.

    public void receiveEvent(Event<Student> event) {
    if (event.getType() == EventType.REQUEST_COMPLETED){
        pQueue.poll();
    }

    else{


    }
}

С некоторой помощью я придумал этот метод сравнения. Однако проблема все еще сохраняется, когда новый учащийся сравнивается с первым учащимся в списке, а его средний балл не выше, он добавляет этого учащегося в конец списка без проверки с другими учащимися в pQueue.

PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, new Comparator<Student>(){
    @Override
    public int compare(Student o1, Student o2){
        if (o1.equals(o2))
            return 0;
        else if(o1.getGpa() > o2.getGpa())
            return -1;
        else
            return 1;
    }

});

private boolean equals (Student o1, Student o2){
    if (o1.getGpa() == o2.getGpa())
        return true;
    else
        return false;
}

person Pds0303    schedule 06.09.2016    source источник
comment
Вы должны предоставить экземпляр Comparator. Реализуйте класс с помощью Comparator<Student> и передайте его экземпляр в конструктор PriorityQueue.   -  person 11thdimension    schedule 06.09.2016


Ответы (2)


Второй параметр ожидает объект Comparator, а не прямой вызов метода compareTo:

//Create Priority Queue
PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, new Comparator<Student>() {

        @Override
        public int compare(Student o1, Student o2) {
            // your logic
        }
    });

Метод "compare(T o1, T o2)" является частью этого объекта Comparator и должен быть определен в одном из них.

person OH GOD SPIDERS    schedule 06.09.2016
comment
В настоящее время в классе. Это имеет смысл, и я сообщу позже, когда буду работать над этим. Спасибо! - person Pds0303; 06.09.2016
comment
Так что это хорошо сработало для меня! Спасибо тебе за это. Однако я столкнулся с другой проблемой, и, возможно, вы можете объяснить ее мне. Я сравниваю этих студентов на основе их среднего балла. И когда я пройдусь по своей программе, в мою pQueue будет добавлен новый студент, и он сравнит его со студентом, первым в моем списке, но если средний балл моих новых студентов не выше, чем у первого студента в моем списке, он продолжит и поместите его в конец моей pQueue, не сверяя с другими учениками в моем списке. Я добавил свой метод сравнения выше... - person Pds0303; 07.09.2016

Создайте новый класс, который реализует интерфейс Comparator, и передайте этот экземпляр класса в свою приоритетную очередь.

Если ваш средний балл относится к типу Class/Reference: (например, Integer, Double, Float), вы можете использовать следующий код:

PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, new Comparator<Student> {

    @Override
    public int compare(Student arg0, Student arg1) {
        // TODO Auto-generated method stub
        return arg0.getGPA().compareTo(arg1.getGPA());
    }
});

Если ваш средний балл имеет примитивный тип: (например, int, double, float), вы можете использовать следующий код:

@Override
    public int compare(Student arg0, Student arg1) {
        // TODO Auto-generated method stub
        return Integer.compare(arg0.getGPA(),arg1.getGPA());
    }

Примечание. Замените целое число в соответствии с вашим типом данных.

compareTo() не обязательно возвращает только -1, 0 или 1. compareTo()return 0 для обоих объектов равны, значение меньше нуля, если obj1 ‹ obj2, и значение больше нуля, если obj1 > obj2. Этот метод является встроенным объявлением компаратора.

person Abhijeet    schedule 06.09.2016
comment
Спасибо за отзыв! Я создал такой метод сравнения и разместил его выше с моей логикой. У меня все еще есть проблема, которая возникает, когда новый студент добавляется в список, он сравнивается с первым студентом в моей pQueue, и если его средний балл не выше, чем у студента в верхней части моего списка, они отправлен на дно, не сравниваясь ни с какими другими учениками в моем списке. Если вы можете что-нибудь придумать, я был бы очень признателен! - person Pds0303; 07.09.2016
comment
Я обновил код. Вы можете использовать в соответствии с вашим типом данных GPA - person Abhijeet; 07.09.2016