我已经做了一些搜索,但尚未找到答案。
我有一个对象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;
}
非常感谢任何帮助!
答案 0 :(得分:2)
如果您想节省一些时间,请保持数据模型不变,您可以做的是:
使用list
对Tasks
进行排序,但使用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。事实证明,这些课程令人困惑和有缺陷。他们缺少一个真正的仅限日期的课程,没有时间和时区。
我当然会将类中的date-only值存储为仅限日期的对象,特别是在Java 8及更高版本中内置的java.time框架中找到的LocalDate
类。
JSR 310定义了java.time的规范。受到非常成功的Joda-Time项目的启发。
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 );