4

我有一个列表,其中包含格式为字符串格式(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 格式的日期,转换字符串和解析将需要很长时间。

4

3 回答 3

6

好的,我看到你纠正了错字。

现在,请记住DateFormatter,除了解析数据之外,还需要在呈现数据时使用 a。

所以请试试这个:

        for (Date date1 : xyz) {
            System.out.println("Sorted : " + new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH).format(date1));
        }

您可能希望将SimpleDateFormat类的所有方法作为字段提供给您。

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

祝你好运。

于 2013-06-24T11:17:54.817 回答
1

您已经将您的对象解析dateString为实际Date对象。并且java.util.Date无法格式化。只能获得该对象的String表示。Date

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

如果您要对Date对象进行排序,您将获得您所拥有的输出。此外,正如@darijan 所述,更改比较器中的逻辑。

于 2013-06-24T11:17:23.033 回答
0

First i think it's better to have only one instance of SimpleDateFormat and always use this to parse your dates.
I also suggest to create this instance of SimpleDateFormat in front of your try block, so you solve your second problem and can use SimpleDateFormat.format(date) to parse your dates back to requested stringformat.

于 2013-06-24T11:21:35.833 回答