在Java中对月份和年份进行排序的最佳有效方法

在Java中对月份和年份进行排序的最佳有效方法,java,datetime,Java,Datetime,我有一个列表,其中包含字符串格式的日期(MON-YYYY),我需要对该列表进行排序。到目前为止,我一直采用的方法是读取列表并将字符串转换为日期格式,然后使用比较选项,但我没有得到所需的结果 代码片段 List<String> abc = new ArrayList<String>(); List<Date> xyz = new ArrayList<Date>(); abc.add("JAN-2010");

我有一个列表,其中包含字符串格式的日期(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
预期产出

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格式的日期,转换字符串和解析将花费很长时间

您已经将
日期字符串
解析为实际的
日期
对象。和
java.util.Date
无法格式化。只能获取该
日期
对象的
字符串
表示形式

您需要更改比较器,通过将字符串内部转换为日期来比较
dateString
格式


如果您要对
Date
对象进行排序,您将得到您得到的输出。另外,如darijan所述,更改比较器中的逻辑。

好的,我看到您更正了输入错误

现在,请记住,除了解析数据外,在显示数据时还需要使用
DateFormatter

因此,请尝试以下方法:

        for (Date date1 : xyz) {
            System.out.println("Sorted : " + new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH).format(date1));
        }
您可能希望将
simpleDataFormat
作为字段提供给类的所有方法

其他信息:请注意
SimpleDateFormat
已知不是线程安全的。您可以使用
ThreadLocal
作为一种解决方案


祝你好运。

首先,我认为最好只有一个
SimpleDataFormat
实例,并始终使用它来解析日期。

我还建议在
try
块前面创建
SimpleDateFormat
的这个实例,这样就可以解决第二个问题,并可以使用
SimpleDateFormat.format(date)
将日期解析回请求的字符串格式。

您正在将
arg0
arg0
进行比较,这显然是错误的。请参见如何对日期集合进行排序。无需使用比较器。日期是可比的Darijan,我已经更新了…这是一个打字错误error@SJagdeesh请看下面我的最新答案。