2011-05-19 168 views
1

我有一个arrayList。特殊字符串排序列表,按日期排列

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

例如:

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

我想排序此ArrayList的日期。
我该怎么做?

回答

0

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

Comparator<String> myComparator = new Comparator<String>() { 

int compareTo(String string1, String string2) { 
    ...... 
} 

boolean equals(String str1) { 
    ...... 
} 

} 
+1

小心复杂性:这意味着每个比较解析每个日期字符串 – 2011-05-19 13:39:22

1

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

+2

谨防复杂性:这意味着解析每个日期字符串每次比较一次 – 2011-05-19 13:39:10

5

可以编写解析日期和使用date.compareTo(otherDate)对其进行排序比较,但我建议你存储dates,而不是Strings摆在首位,使分类更加容易(日期实现Comparable<Date>

(如果你的输入格式为String,则转换Strings的时候将它们添加到列表中)

+0

+1,尽管我建议除了*字符串之外还存储Date * ,而不是“而不是”。 – CPerkins 2011-05-19 13:45:20

+0

@Cperkins然后,你应该upvote克里斯托弗哈马斯特罗姆的回答:-) – 2011-05-19 13:48:14

+0

+1:尼斯想转换输入字符串。 – 2011-05-19 13:51:21

4

对于每个String,将其转换为Date,可能使用SimpleDateFormat,并把它们全部放入TreeMap<Date,String>,这会将它们分类给你。

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

+0

我喜欢这个想法,这是两全其美的解决方案(1+) – 2011-05-19 13:47:10

0

数组转换成日期列表,然后对它们进行排序:如果你想保持任务名称

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); 

,你将不得不做出这样的有日期和领域的任务,自己的对象和按日期可比。

2

我会先转换成这个数组列表,像

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

之后,建立比较器,2个事件是这样的:

这将节省您相比万吨性能(原谅我)为每个比较解析每个字符串。

+0

+1的另一个有效解决方案,尽管我宁愿和我的同事或Christoffer – 2011-05-19 13:52:09