Мой список сортируется в алфавитном порядке после сортировки по дате, пока я добавляю 4-5 элементов в свой список

Мой список сортируется в алфавитном порядке после сортировки по дате, в то время как я добавляю в свой список 4-5 дополнительных элементов с разными именами. Я хочу отсортировать свой список только по дате и времени.

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

// Filters All patient to keep only single latest record of each patient id
private List<PatientData> filterPatients(List<PatientData> allPatientData) throws ParseException {

    HashMap<String ,Pair<PatientData,Date>> filtered = new HashMap<>();
    SimpleDateFormat inSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    for(PatientData p : allPatientData){
        if (filtered.containsKey(p.getPatientId())){
            Pair<PatientData,Date> _p = filtered.get(p.getPatientId());
            Date d1 = _p.second;
            Date d2 = inSdf.parse(p.getScanDate());
            if (d2.after(d1)){
                filtered.put(p.getPatientId(), new Pair<>(p, d2));
            }
        }else{
            if (p.getScanDate() != null)
                filtered.put(p.getPatientId(), new Pair<>(p, inSdf.parse(p.getScanDate())));
        }
    }


    List<Pair<PatientData,Date>> filteredPairs = new ArrayList<>(filtered.values());
    Collections.sort(filteredPairs,new Comparator<Pair<PatientData, Date>>() {
        @Override
        public int compare(Pair<PatientData, Date> t1, Pair<PatientData, Date> t2) {
            if (t1.second.after(t2.second)){
                return -1;
            }else if (t1.second.before(t2.second)){
                return 1;
            }
            else
                return t1.first.getPatientId().compareTo(t2.first.getPatientId());
        }
    });
    List<PatientData> filteredList = new ArrayList<>(filteredPairs.size());



    for(Pair<PatientData,Date> p : filteredPairs){
        filteredList.add(p.first);
    }
    return filteredList;
}

Чтобы избежать сортировки по идентификатору пациента, вместо return t1.first.getPatientId().compareTo(t2.first.getPatientId()); используйте return 0;?

Ole V.V. 18.12.2018 11:18

Я рекомендую вам избегать классов Date и SimpleDateFormat. Они не только давно устарели, но и доставляют немало хлопот. Сегодня у нас намного лучше в java.time, современный API даты и времени Java.

Ole V.V. 18.12.2018 20:13

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

Dharam Dutt Mishra 20.12.2018 05:53

Извините, мне сложно предоставить рабочий код. Я не могу заставить ваш код работать здесь, потому что это зависит от классов и методов, которых у меня нет. И я не уверен, что понял вашу проблему. (Уменьшенный) пример желаемого результата и наблюдаемого результата может помочь, чтобы мы могли точно увидеть, чем они отличаются. Какой код вам подходит, также зависит от вашего уровня API, которого я не знаю.

Ole V.V. 20.12.2018 06:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
60
1

Ответы 1

java.time

Во-первых, в вашем классе PatientData не используйте строку для даты сканирования. Используйте тип даты и времени и предпочитайте современный Instant старомодному Date. Для удобства у вас может быть конструктор и / или сеттер, который принимает строку и анализирует ее. Например:

public class PatientData {

    private String patientId;
    private Instant scanDate;

    public PatientData(String patientId, String scanDateString) {
        this.patientId = patientId;
        setScanDate(scanDateString);
    }

    public void setScanDate(String scanDateString) {
        scanDate = Instant.parse(scanDateString);
    }

    // getters, etc.
}

Теперь вам не нужно строить пары, вы можете просто использовать только класс PatientData. Чтобы отсортировать список PatientData:

    Collections.sort(filteredList, new Comparator<PatientData>() {
        @Override
        public int compare(PatientData pd1, PatientData pd2) {
            return pd1.getScanDate().compareTo(pd2.getScanDate());
        }
    });

Или, если ваш уровень API достаточно высок (соответствует Java 8):

    Collections.sort(filteredList, Comparator.comparing(PatientData::getScanDate));

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android. Просто требуется как минимум Java 6.

  • В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Он называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

Другие вопросы по теме