Android中如何按字符串日期对Customer对象排序?
解决Android中按日期字符串排序Customer对象的问题
嘿,我一眼就看出你卡在哪了——日期格式字符串和实际的日期格式不匹配,直接导致了解析异常,进而让你的排序逻辑完全失效了!
问题根源
你的日期是19.Jul.2019这种「日.英文月份缩写.年」的格式,但你用的SimpleDateFormat("dd/MM/yyyy")是用来匹配「日/数字月/年」的,两者完全不对应,自然会抛出ParseException。更糟的是,异常发生后你直接返回了0,这会让Comparator认为两个Customer对象的日期相等,排序结果当然会乱掉。
修正方案一:修复SimpleDateFormat的格式字符串
把格式改成和你的日期匹配的dd.MMM.yyyy,同时记得指定英文Locale(避免不同系统的Locale导致月份缩写解析失败),还要改进异常处理逻辑(别直接返回0):
public static Comparator<Customer> dateNewOld = new Comparator<Customer>() { @Override public int compare(Customer o1, Customer o2) { // 指定英文Locale,确保Jul等英文月份缩写能被正确解析 DateFormat dateFormatter = new SimpleDateFormat("dd.MMM.yyyy", Locale.ENGLISH); try { Date date1 = dateFormatter.parse(o1.date); Date date2 = dateFormatter.parse(o2.date); // 倒序排序(最新日期在前) return date2.compareTo(date1); } catch (ParseException e) { // 不要直接返回0,这里可以抛出运行时异常提醒错误,或者把解析失败的日期放到末尾 throw new RuntimeException("日期解析失败,请检查格式: " + o1.date + " / " + o2.date, e); // 如果想容忍错误,比如把解析失败的日期排到最后: // return Boolean.compare(o1.date == null || o1.date.trim().isEmpty(), o2.date == null || o2.date.trim().isEmpty()); } } };
更推荐的方案二:使用Java 8+的日期API(Android API 26+ 或兼容库)
SimpleDateFormat是线程不安全的,而且Java 8之后的日期API(java.time包)更健壮、易用。如果你的项目支持Android API 26+,可以直接用LocalDate和DateTimeFormatter;如果要兼容旧版本,可以引入ThreeTenABP库:
public static Comparator<Customer> dateNewOld = new Comparator<Customer>() { // 初始化一次Formatter,避免重复创建 private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MMM.yyyy", Locale.ENGLISH); @Override public int compare(Customer o1, Customer o2) { try { LocalDate date1 = LocalDate.parse(o1.date, dateFormatter); LocalDate date2 = LocalDate.parse(o2.date, dateFormatter); // 倒序排序 return date2.compareTo(date1); } catch (DateTimeParseException e) { throw new RuntimeException("日期格式错误,请检查: " + o1.date + " / " + o2.date, e); } } };
最后一步:执行排序
不管用哪个方案,最后调用Collections.sort()时传入你的Comparator即可:
Collections.sort(yourCustomerArrayList, Customer.dateNewOld);
别忘了确认你的Customer类的date字段确实是19.Jul.2019这种格式,没有多余的空格、标点错误哦!
内容的提问来源于stack exchange,提问作者Anas khan
相关产品推荐
相关产品推荐

