Сортировка объектов ArrayList по дате и времени - PullRequest
1 голос
/ 16 июня 2019

У меня есть 10 объектов в ArrayList с идентификатором пациента и датой назначения в качестве переменных экземпляра.Как отсортировать пациентов по дате назначения?

По какой-то причине я не могу использовать Comparator для сортировки ArrayList;компилятор выдает ошибку:

java.util.Comparator является абстрактным;невозможно создать экземпляр

Collections.sort() не работает для Object, если не используется Comparator.

ArrayList<Appointment> testApp = new ArrayList<>();

while (!App.isEmpty()) {
    tempA = (Appointment) App.dequeue();

    if (tempA.getPatID().equals(search)) {
        testApp.add(tempA);
    }

    tempApp.enqueue(tempA);
}

while (!tempApp.isEmpty()) {
    tempA = (Appointment) tempApp.dequeue();
    App.enqueue(tempA);
}

Collections.sort(testApp, new Comparator<Appointment>());

Ответы [ 4 ]

4 голосов
/ 16 июня 2019

Я предполагаю, что ваш Appointment класс выглядит примерно так:

class Appointment {
    private int patientId;
    private LocalDateTime appointmentDate;

    // Getters & setters
}

Если это так, вы бы создали Comparator для сортировки, используя Comparator.comparingmethod:

ArrayList<Appointment> appointments = new ArrayList<>();

Collections.sort(appointments, Comparator.comparing(appointment -> {
    return appointment.getAppointmentDate();
}));

Эта лямбда-функция сообщает компаратору, как взять ваш объект (Appointment) и извлечь элемент, используемый для сортировки (ключ; appointmentDate).Он может быть сокращен до ссылки на метод, если вам нравится:

Collections.sort(appointments, Comparator.comparing(Appointment::getAppointmentDate));

Вы также можете вызвать Collection#sort() непосредственно на ArrayList:

appointments.sort(Comparator.comparing(Appointment::getAppointmentDate));

Если вы всегда (или обычно) собираетесь сортировать свои Appointment объекты по дате, вы могли бы подумать о том, чтобы Appointment реализовать Comparable, чтобы вы могли вызывать .sort() безпрохождение Comparator:

class Appointment implements Comparable<Appointment> {
    private int patientId;
    private LocalDateTime appointmentDate;

    // Getters & setters

    @Override
    public int compareTo(final Appointment other) {
        return appointmentDate.compareTo(other.appointmentDate);
    }
}
0 голосов
/ 16 июня 2019

Вы не можете создать экземпляр Comparator напрямую, вам нужно реализовать логику самостоятельно, перечислите это

    Comparator<Appointment> comp = new Comparator<>() {
        public int compare(Appointment a1, Appointment a2) {
            // Logic to compare here, see javadoc of that method
            return 0;
        }
    }

    testApp.sort(comp);

Используя лямбда-выражение, вы можете написать такой код:

    testApp.sort((a1, a2) -> {
        // Logic to compare here, see javadoc of that method
        return 0;
    });

Если Appointment - это класс, который вы написали сами, вы можете заставить его реализовать Comparable<Appointment>:

class Appointment implements Comparable<Appointment> {
        public int compareTo(Appointment a2) {
            // Logic to compare here, see javadoc of that method
            return 0;
        }
}

Это означает, что вы можете отсортировать свой список без указания компаратора:

    testApp.sort(null);
0 голосов
/ 16 июня 2019
private static final Comparator<Appointment> SORT_BY_DATE_DESC = Comparator.comparing(Appointment::getDate).reversed();

public static void main(String... args) {
    List<Appointment> appointments = Collections.emptyList();
    appointments.sort(SORT_BY_DATE_DESC);
}

public static class Appointment {
    private Date date;

    public Date getDate() {
        return date;
    }
}
0 голосов
/ 16 июня 2019

чтобы ваши экземпляры классов были сопоставимы друг с другом, в вашем классе реализован интерфейс «Comparable».например, если у вас есть класс с именем C1 и вы хотите, чтобы экземпляры C1 были сопоставимы, вы чаще всего объявляете C1 следующим образом:

public class C1 implements Comparable<C1>{
//some codes

@Override
public int compareTo(C1 other){
// here you can compare this instance of C1 (references with this keyword) with other

}

}

сейчас, если вы используете Collections.sort(), ваш arrayList будет сортировать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...