如何在Java中对字符串数组中的日期进行排序?

时间:2014-09-05 02:08:00

标签: java arrays date simpledateformat

我想创建一个日期数组并对其进行排序。这就是我能够做到的,但这不是我所要求的。

   java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
   java.util.Date date1 = sdf.parse("05-03-2014");
   java.util.Date date2 = sdf.parse("23-08-2014");
   java.util.Date dates[] = {date1, date2};
   java.util.Arrays.sort(dates);
   System.out.println(java.util.Arrays.toString(dates));

因为我有一个字符串数组"字符串日期[] = {" 05-11-2014"," 23-08-2014"," 05 -02-2013"};" 所以我必须在字符串数组中对日期进行排序。如何更改代码?

2 个答案:

答案 0 :(得分:7)

更好的方法是将String数组转换为Date数组

Date[] arrayOfDates = new Date[dates.length];
for (int index = 0; index < dates.length; index++) {
    arrayOfDates[index] = sdf.parse(dates[index]);
}

然后对arrayOfDates进行排序,如果需要,请使用SimpleDateFormat将结果格式化回dates数组...

Arrays.sort(arrayOfDates);
for (int index = 0; index < dates.length; index++) {
    dates[index] = sdf.format(arrayOfDates[index]);
}

如果dates数组中的一个或多个值格式无效,则可以更好地控制应该执行的操作。

另一个“脏”的解决方案是使用自定义Comparator,将值转换为内联Date并进行比较。

如果你可以保证dates的有效性,这是可以的,但是如果你不能,那就开始分崩离析了,例如......

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DirtySort {

    public static void main(String[] args) {
        String dates[] = {"05-11-2014", "23-08-2014","05-02-2013"};
        Arrays.sort(dates, new Comparator<String>() {
            private SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
            @Override
            public int compare(String o1, String o2) {
                int result = -1;

                try {
                    result = sdf.parse(o1).compareTo(sdf.parse(o2));
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }

                return result;
            }
        });

        for (String date : dates) {
            System.out.println(date);
        }
    }

}

答案 1 :(得分:1)

使用日期 - 时间类型

answer by MadProgrammer是正确的。使用日期时间值时,请将它们用作日期时间数据类型。这通常是最好的。如果您有一堆表示数字的字符串,那么您是否不能为业务逻辑转换为数字数据类型?

避免java.util.Date

我对另一个答案的唯一改进是建议不要使用java.util.Date。与Java捆绑在一起的类和.Calendar都是众所周知的麻烦,应该避免。

而是使用受Joda-Time启发的Java 8中的Joda-Time库或新的java.time package

日期 - 仅

Joda-Time和java.time都提供LocalDate类来处理没有任何时间或时区的仅限日期的值。就这个问题而言。

约达时间

我们使用DateTimeFormatter通过调用parseLocalDate来解析字符串。如果您不信任您的数据源,请陷阱IllegalArgumentException

以下是一些使用Joda-Time 2.4的代码。

List<LocalDate> list = new ArrayList<LocalDate>();
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
String dates[] = { "05-11-2014" , "23-08-2014" , "05-02-2013" };
for ( String string : dates ) {
    LocalDate localDate = formatter.parseLocalDate( string );
    list.add( localDate );
}
Collections.sort( list );

转储到控制台。以原始格式输出。

System.out.println( "list: " + list );

StringBuilder output = new StringBuilder( "Localized sorted list of dates: " );
for ( LocalDate localDate : list ) {
    output.append( formatter.print( localDate ) ).append( " | " );
}
System.out.println( output );

跑步时。

list: [2013-02-05, 2014-08-23, 2014-11-05]
Localized sorted list of dates: 05-02-2013 | 23-08-2014 | 05-11-2014 | 

或者,使用带有lambdas的新Java 8语法。不确定这是否有所改善。

List<LocalDate> list = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
String[] dateStringsArray = { "05-11-2014" , "23-08-2014" , "05-02-2013" };
List<String> dateStringsList = new ArrayList<>( Arrays.asList( dateStringsArray ) );
dateStringsList.stream().map( ( string ) -> formatter.parseLocalDate( string ) ).forEach( ( localDate ) -> {
    list.add( localDate );
} );
Collections.sort( list );

System.out.println( "list: " + list );

StringBuilder output = new StringBuilder( "Localized sorted list of dates: " );
list.stream().forEach( ( localDate ) -> {
    output.append( formatter.print( localDate ) ).append( " | " );
} );
System.out.println( output );