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

Мой список сортируется в алфавитном порядке после сортировки по дате, в то время как я добавляю в свой список 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;
}

1 Ответ

0 голосов
/ 20 декабря 2018

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 используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...