我有一个列表,其中包含格式(MON-YYYY)字符串格式的日期,我需要对此列表进行排序。我一直遵循的方法是读取列表并以日期格式转换字符串并使用比较选项,但我没有得到理想的结果
代码段
List<String> abc = new ArrayList<String>();
List<Date> xyz = new ArrayList<Date>();
abc.add("JAN-2010");
abc.add("JAN-2011");
abc.add("APR-2013");
abc.add("NOV-2009");
try {
for (String abc1 : abc) {
Date date;
date = new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH)
.parse(abc1);
xyz.add(date);
}
Collections.sort(xyz, new Comparator<Date>() {
public int compare(Date arg0, Date arg1) {
// return arg0.getDate().compareTo(o2.getDate());
return arg0.compareTo(arg1);
}
});
for (Date date1 : xyz) {
System.out.println("Sorted : " + date1);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
输出
Sorted : Sun Nov 01 00:00:00 IST 2009
Sorted : Fri Jan 01 00:00:00 IST 2010
Sorted : Sat Jan 01 00:00:00 IST 2011
Sorted : Mon Apr 01 00:00:00 IST 2013
预期输出
NOV-2009
JAN-2010
JAN-2011
APR-2013
我也不确定上面的代码在性能方面是否完美,因为如果我在列表中有MON-YYYY格式的数千个日期,转换字符串和解析会花费很长时间。
答案 0 :(得分:6)
好的,我看到你纠正了错字。
现在,请记住,除了解析数据时,还需要在显示数据时使用DateFormatter
。
所以请试试这个:
for (Date date1 : xyz) {
System.out.println("Sorted : " + new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH).format(date1));
}
您可能希望将SimpleDateFormat
作为字段提供给班级的所有方法。
其他信息:请注意SimpleDateFormat
已知不是线程安全的。您可以使用ThreadLocal
作为解决方案。
答案 1 :(得分:1)
您已将dateString
解析为实际的Date
对象。并且java.util.Date
无法格式化。只能获得该String
个对象的Date
个表示。
您需要通过内部将字符串转换为日期来更改比较器以比较dateString
格式。
如果您要对Date
个对象进行排序,您将获得所获得的输出。另外,如 @darijan 所述,更改比较器中的逻辑。
答案 2 :(得分:0)
首先,我认为最好只有SimpleDateFormat
的一个实例并始终使用它来解析您的日期。
我还建议在SimpleDateFormat
块前面创建此try
实例,以便解决第二个问题,并使用SimpleDateFormat.format(date)
将日期解析回请求的字符串格式。