按年份,月份,日期排序(Java)

时间:2016-03-06 14:46:19

标签: java android sorting

我已经做了一些搜索,但尚未找到答案。

我有一个对象Task,它以StringBuilder的格式DD/MM/YYYY存储日期。它来自DateSpinner。我选择将其存储为StringBuilder,因为我完全忘了我稍后要对Task(s)列表进行排序。

我要问的是,如果最好重写类和活动代码并存储为日期,然后使用Comparator,或者我是否应该(正如我目前正在尝试的那样)创建每个对象的临时日期,然后使用它来对列表进行排序

谷歌向我展示了基数排序,但我没有看到通过三种方式进行排序的方法。

任务类

public Task(String identifier, String name, String description, ArrayList<TeamMember> members, int hours, StringBuilder date) {
    this.id = identifier;
    this.name = name;
    this.desc = description;
    this.members = new ArrayList<>();
    this.hours = hours;
    this.date = date;

}

public String getId() {
    return id;
}

public String getName() {
    return name;
}

public String getDesc() {
    return desc;
}

public ArrayList<TeamMember> getMembers() {
    return members;
}

public int getHours() {
    return hours;
}

public StringBuilder getDate() {
    return date;
}
} 

我的初始(WIP)尝试按日期排序

    for(Task t : tasks){
        String dateString = t.getDate().toString();
        List<String> date = Arrays.asList(dateString.split("/"));
        Calendar c =  Calendar.getInstance();
        c.set(Integer.parseInt(date.get(0)),Integer.parseInt(date.get(1))-1,Integer.parseInt(date.get(2)));
        Task temp = t;

    }

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

如果您想节省一些时间,请保持数据模型不变,您可以做的是:

使用listTasks进行排序,但使用collection并传递一个匿名comparator,将字符串日期解析为日期对象并比较列表以该日期为标准的元素。

最后,列表中的所有Tasks都将按日期正确排序。

一个例子:

Collections.sort(yourTasksList, new Comparator<Task>() {

    @Override
    public int compare(Task o1, Task o2) {
        try {
            return new SimpleDateFormat("DD/MM/yyyy").parse(o1.getDate().toString()).compareTo(new SimpleDateFormat("DD/MM/yyyy").parse(o2.getDate().toString()));
        } catch (ParseException e) {
            return 0;
        }
        }
    });

并添加System.out.println(yourTasksList);

答案 1 :(得分:0)

Xoce的other Answer是正确的。

避免旧的日期时间类

此外,我建议放弃使用麻烦的旧日期时间类java.text.SimpleDateFormat和java.util.Date/Calendar。事实证明,这些课程令人困惑和有缺陷。他们缺少一个真正的仅限日期的课程,没有时间和时区。

java.time

我当然会将类中的date-only值存储为仅限日期的对象,特别是在Java 8及更高版本中内置的java.time框架中找到的LocalDate类。

JSR 310定义了java.time的规范。受到非常成功的Joda-Time项目的启发。

ThreeTen-反向移植

Android还没有Java 8技术,因此我建议使用Android-specific wrapped version项目的ThreeTen-Backport,该项目为旧的Java实现实现了java.time样式的类。

解析输入字符串。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy" );
LocalDate ld = LocalDate.parse( "23/01/2016" , formatter );

如果您需要“今天”,请务必指定时区,因为任何特定时刻全球各地的日期会有所不同。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

在Xoce的答案中看到的代码中,将return行替换为:

return o1.localDate.compareTo( o2.localDate );