Мой список сортируется в алфавитном порядке после сортировки по дате, в то время как я добавляю в свой список 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;
}
Я рекомендую вам избегать классов Date
и SimpleDateFormat
. Они не только давно устарели, но и доставляют немало хлопот. Сегодня у нас намного лучше в java.time
, современный API даты и времени Java.
не могли бы вы прислать мне реализацию кода, потому что я новичок в Android, поэтому сложно понять, как его реализовать.
Извините, мне сложно предоставить рабочий код. Я не могу заставить ваш код работать здесь, потому что это зависит от классов и методов, которых у меня нет. И я не уверен, что понял вашу проблему. (Уменьшенный) пример желаемого результата и наблюдаемого результата может помочь, чтобы мы могли точно увидеть, чем они отличаются. Какой код вам подходит, также зависит от вашего уровня API, которого я не знаю.
Во-первых, в вашем классе 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 6.
org.threeten.bp
с подпакетами.java.time
.java.time
.java.time
для Java 6 и 7 (ThreeTen для JSR-310).
Чтобы избежать сортировки по идентификатору пациента, вместо
return t1.first.getPatientId().compareTo(t2.first.getPatientId());
используйтеreturn 0;
?