【问题标题】:sort array list of special strings, by date按日期对特殊字符串的数组列表进行排序
【发布时间】:2011-05-19 13:33:52
【问题描述】:

我有一个数组列表。

这是一个字符串数组列表。该字符串包含"Date.toString",格式为"January 1, 1970, 00:00:00 GMT" + 任务名称。

例如:

"January 1, 1970, 00:00:00 GMT clean the house".

我想按日期对这个数组列表进行排序。
我该怎么做?

【问题讨论】:

    标签: java arraylist sorting


    【解决方案1】:

    可以编写一个比较器来解析日期并使用date.compareTo(otherDate) 对它们进行排序,但我建议您首先存储dates 而不是Strings,这样可以进行很多排序更容易(日期实现Comparable<Date>

    (如果您的输入格式是String,则在将它们添加到列表时转换Strings

    【讨论】:

    • +1,虽然我建议将日期 存储在字符串之外,而不是“代替”。
    • @Cperkins 那么你应该支持 Christoffer Hammarström 的回答 :-)
    【解决方案2】:

    对于每个String,将其转换为Date,可能使用SimpleDateFormat,然后将它们全部放入TreeMap<Date,String>,这将为您排序。

    编辑:正如@Sean Patrick Floyd 建议的那样,在输入时进行。

    【讨论】:

    • 我喜欢这个想法,它是两全其美的解决方案 (1+)
    【解决方案3】:

    我会先把这个数组列表转换成类似的东西

    public class Event {
        private Date date;
        private String description;
        ...
    }
    

    之后,创建一个比较器来比较两个事件,如下所示:

    public class EventComparator implements Comparator<Event>{
        public int compare(Event e1, Event e2) {
            return e1.getDate().compareTo(e2.getDate());
        }
    }
    

    与(请原谅我)每次比较时解析每个字符串相比,这将为您节省大量性能。

    【讨论】:

    • +1 以获得另一个有效的解决方案,尽管我更愿意选择我的或 Christoffer 的
    【解决方案4】:

    编写一个比较器,在其中将字符串转换为日期以进行比较。 Collections.sort(List, Comparator); 在那之后完成这项工作。

    【讨论】:

    • 注意复杂性:这意味着每次比较时解析每个日期字符串一次
    【解决方案5】:

    编写您自己的比较器。然后使用Collections.sort(arrayList, myComparator);

    Comparator<String> myComparator = new Comparator<String>() {
    
     int compareTo(String string1, String string2) {
         ......
     }
    
     boolean equals(String str1) {
        ......
     }
    
    }
    

    【讨论】:

    • 注意复杂性:这意味着每次比较时解析每个日期字符串一次
    【解决方案6】:

    将数组转换为日期列表,然后对其进行排序:

    List<Date> dates = new ArrayList<Date>();
    for(String s : dateStringArray){
      // split the date and task name
      Pattern p = Pattern.compile("(\\w+ \\d{1,2}, \\d{4}, \\d{2}:\\d{2}:\\d{2} \\w{3})(.*)");
      Matcher matcher = p.matcher(s);
      String taskname = "";
      String datestring = "";
      if (matcher.find()) {
        datestring = matcher.group(1);
        taskname = matcher.group(2);
      }
      // parse the date
      Date d = new SimpleDateFormat("MMMM dd, yyyy, HH:mm:ss z", 
                   Locale.ENGLISH).parse(datestring);
      dates.add(d);
    }
    // sort the dates
    Collections.sort(dates);
    

    如果您想保留任务名称,您必须创建自己的对象,这些对象将日期和任务作为字段并按日期进行比较。

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 2021-07-26
      • 2015-08-21
      • 1970-01-01
      • 2021-06-03
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多