在Java中对Months和Year进行排序的最佳方法
我有一个列表,其中包含格式(MON-YYYY)字符串格式的日期,我需要对此列表进行排序。我一直遵循的方法是读取列表并使用日期格式转换字符串并使用比较选项,但我我没有得到理想的结果
代码片段
List abc = new ArrayList(); List xyz = new ArrayList(); 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() { 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格式的数千个日期。
好的,我看到你纠正了错字。
现在,请记住,除了解析数据时,还需要在显示数据时使用DateFormatter
。
所以请试试这个:
for (Date date1 : xyz) { System.out.println("Sorted : " + new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH).format(date1)); }
您可能希望将SimpleDateFormat
作为字段用于类的所有方法。
附加信息:请注意, SimpleDateFormat
不是线程安全的。 您可以使用ThreadLocal
作为解决方案。
祝你好运。
您已将dateString
解析为实际的Date
对象。 并且java.util.Date
无法格式化。 只能获得该Date
对象的String
表示forms。
您需要更改比较器以通过内部将字符串转换为日期来比较dateString
格式。
如果你要对Date
对象进行排序,你将获得你得到的输出。 另外,如@darijan所述 ,更改比较器中的逻辑。
首先,我认为最好只有一个SimpleDateFormat
实例,并始终使用它来解析您的日期。
我还建议在try
块前面创建SimpleDateFormat
这个实例,这样你就解决了第二个问题,可以使用SimpleDateFormat.format(date)
将你的日期解析回请求的stringformat。