Java程序对日期列表进行排序,格式为dd MMM yyyy

时间:2018-10-12 07:27:58

标签: java sorting date

输入是一个包含字符串格式日期的列表。我有如下解决方案。但是我觉得可以提高效率。任何帮助将不胜感激。

//映射以存储月份数据

HashMap<String,String> month = new HashMap<String,String>();
        month.put("Jan","01");
        month.put("Feb","02");
        month.put("Mar","03");
        month.put("Apr","04");
        month.put("May","05");
        month.put("Jun","06");
        month.put("Jul","07");
        month.put("Aug","08");
        month.put("Sep","09");
        month.put("Oct","10");
        month.put("Nov","11");
        month.put("Dec","12");

您可以将其视为输入

    String[] input = {"20 Oct 2052",
    "26 May 1960",
    "06 Jun 1933",
    "06 Jun 1933",
    "06 Jun 1933",
};


    ArrayList<Long> temp1 = new ArrayList<Long>();

比较结果

    HashMap<Long,String> temp2 = new HashMap<Long,String>();

    ArrayList<String> result = new ArrayList<String>();
    for(int i = 0 ; i< input.length ; i++){
        String j = "";
        if(input[i].length() == 11){

            j+= input[i].substring(7,11);
            j+= month.get(input[i].substring(3,6));
            j+=input[i].substring(0,2);

            temp1.add(Long.parseLong(j));
            temp2.put(Long.parseLong(j), input[i]);   
        }
    }

排序结果

Collections.sort(temp1);

打印结果

System.out.println(temp1.toString());

5 个答案:

答案 0 :(得分:2)

Radix Sort是您的朋友。只需使用此算法对字符串进行排序。这是最佳解决方案。

答案 1 :(得分:2)

首先,我将日期字符串解析为Date对象

DateFormat format = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH);
Date date = format.parse("26 May 1960");

您可以创建一个包含Date对象的对象,然后使其具有可比性。

public class DateContainer implements Comparable<DateContainer > {
 private Date dateTime;

 public DateContainer (Date date){
  this.dateTime = date;
 }

 public Date getDateTime() {
  return dateTime;
 }

 public void setDateTime(Date datetime) {
  this.dateTime = datetime;
 }

 @Override
 public int compareTo(DateContainer o) {
   return getDateTime().compareTo(o.getDateTime());
 }
}

然后您可以在上方创建对象列表,然后使用“收藏夹”对其进行排序

Collections.sort(myList);

答案 2 :(得分:1)

public static void main(String[] args) {
    SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy");
    String[] input = {"20 Oct 2052",
            "26 May 1960",
            "06 Jun 1933",
            "06 Jun 1933",
            "06 Jun 1933",
    };
    Map<Long, String> result = new TreeMap<>();
    Stream.of(input)
            .filter(s -> s.length() == 11)
            .forEach(s -> {
                try {
                    result.put(f.parse(s).getTime(), s);
                } catch (ParseException e) {
                    System.out.println("Wrong Format: " + s);
                }
            });
    System.out.println(result); // {-1154156400000=06 Jun 1933, -303033600000=26 May 1960, 2612970000000=20 Oct 2052}
}

使用SimpleDateFormat获取日期值,并使用TreeMap来对地图中已排序的元素进行

希望对您有帮助!!!!

答案 3 :(得分:1)

这应该可以解决问题

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM yyyy");

List<Date> dates = Arrays.stream(input).map(dateString -> {
try {
    return simpleDateFormat.parse(dateString);
} catch (ParseException e) {
    e.printStackTrace();
}
    return null;
}).collect(Collectors.toList());
dates.sort(Comparator.naturalOrder());

dates.forEach(date -> System.out.println(simpleDateFormat.format(date)));

这是一个两步过程

  1. 转换为java.util.Date
  2. 排序日期列表并打印

希望这会有所帮助!

祝你好运!

答案 4 :(得分:1)

tl; dr

这是使用现代 java.time 类和lambda语法的单行代码。

将每个字符串解析为LocalDate,收集,排序并重新生成字符串作为输出。

Arrays.stream(
        new String[] { "20 Oct 2052" , "26 May 1960" , "06 Jun 1933" , "06 Jun 1933" , "06 Jun 1933" }
)
        .map( input -> LocalDate.parse( input , DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US ) ) )
        .sorted()
        .map( date -> date.format( DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US ) ) )
        .collect( Collectors.toList() )
        .toString()
  

[1933年6月6日,1933年6月6日,1933年6月6日,1960年5月26日,2052年10月20日]

步骤:

  • 生成数组元素(字符串输入)的流。
  • 处理每个输入,进行解析以获得LocalDate
  • 排序LocalDate对象
  • 在每个LocalDate上生成表示其值的文本。
  • 将每个生成的字符串收集到List中。
  • 生成表示字符串列表的文本,现在按时间顺序进行排序。

智能对象,而不是哑字符串

使用适当的数据类型,而不仅仅是字符串。

对于没有日期和时区的仅日期值,请使用LocalDate类。

定义一种格式设置以匹配您的输入。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US );

循环输入,将每个输入解析为LocalDate。将每个结果LocalDate收集到List中。

    List < LocalDate > dates = new ArrayList <>( inputs.length );
    for ( String input : inputs ) {
        LocalDate ld = LocalDate.parse( input , f );
        dates.add( ld );
    }

或者,请使用简短的lambda语法。

List < LocalDate > dates = Arrays.stream( inputs ).map( input -> LocalDate.parse( input , f ) ).collect( Collectors.toList() );

排序LocalDate对象的列表。

Collections.sort( dates );

以标准ISO 8601格式报告您的排序日期。

String outputs = dates.toString() ;
  

[1933-06-06,1933-06-06,1933-06-06,1960-05-26,2052-10-20]

以任何所需的格式报告您的排序日期。

   List < String > outputs = new ArrayList <>( dates.size() );
    for ( LocalDate date : dates ) {
        outputs.add( date.format( f ) );
    }
  

[1933年6月6日,1933年6月6日,1933年6月6日,1960年5月26日,2052年10月20日]


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore