在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。