сортировать массив списков специальных строк по дате - PullRequest
1 голос
/ 19 мая 2011

У меня есть arrayList.

Это массив списков строк. Строка содержит "Date.toString" в формате "January 1, 1970, 00:00:00 GMT" + имя задачи.

Например:

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

Я хочу отсортировать этот arrayList по датам.
Как я могу это сделать?

Ответы [ 6 ]

5 голосов
/ 19 мая 2011

Вы могли бы написать компаратор, который анализирует даты и сортирует их, используя date.compareTo(otherDate), но я бы посоветовал вам сохранить dates вместо Strings, что значительно упростит сортировку(Дата реализует Comparable<Date>.

(Если ваш входной формат String, тогда преобразуйте Strings в момент добавления их в список)

4 голосов
/ 19 мая 2011

Для каждого String, конвертируйте его в Date, возможно, используя SimpleDateFormat, и поместите их все в TreeMap<Date,String>, что отсортирует их для вас.

Редактировать : И, как предложил @Sean Patrick Floyd, сделать это при вводе.

2 голосов
/ 19 мая 2011

Я бы сначала преобразовал этот список массивов во что-то вроде

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

После этого создайте компаратор для сравнения 2 событий, подобных этому:

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

Это сэкономит вам массупроизводительность по сравнению с (простите меня) разбором каждой строки для каждого сравнения.

1 голос
/ 19 мая 2011

Напишите компаратор, в котором преобразуйте строки в даты для сравнения.Collections.sort(List, Comparator); выполняет работу после этого.

0 голосов
/ 19 мая 2011

Преобразовать массив в список дат и затем отсортировать их:

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

Если вы хотите сохранить имена задач, вам придется создавать собственные объекты, которые имеют дату и задачу в качестве полей и сопоставимы по датам.

0 голосов
/ 19 мая 2011

Напишите свой собственный компаратор. Тогда используйте Collections.sort(arrayList, myComparator);

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

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

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...