【发布时间】:2011-12-23 19:44:19
【问题描述】:
我需要根据学生对象中的日期对我的 ArrayList 进行排序...如果日期(加入日期)相同,那么我需要根据 ID 对其进行排序...怎么做?
【问题讨论】:
我需要根据学生对象中的日期对我的 ArrayList 进行排序...如果日期(加入日期)相同,那么我需要根据 ID 对其进行排序...怎么做?
【问题讨论】:
这可以通过两种常见的方式完成。
简单的方法
1) 让学生提供 Comparable 的实现,最终将推迟到日期。这是一个非常简单的操作,但有点 hack。
可维护的方式
2) 或者,Collections.sort 方法将 Comparator 作为输入 - 您可以轻松编写自定义比较器,通过将输入转换为 Student 类并直接返回数据比较来实现排序所需的比较。
第二种解决方案更加模块化和可维护,除非按日期比较是应用程序的基本、核心方面。
【讨论】:
在 Student 类中实现 Comparable 接口。然后使用
Collections.sort(list);
【讨论】:
Collections 类有一个将Comparator 作为参数的排序方法:
List<Student> students;
/* ...students list instantiated and populated somewhere along here... */
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student student1, Student student2) {
return student1.joinDate().compareTo(student2.joinDate());
}
});
我应该补充一点,如果您的列表确实被声明为Object generic,那么您将不得不进行大量转换。该列表应声明为对Student 的通用列表,并且您应该有其他非学生对象列表。
【讨论】:
您可以通过以下两种方式之一:
1) 在您的对象上实现Comparable 接口并调用“Collections.sort(yourList);”。
或者
2) 为Comparator 接口实现一个新类(假设您将该类称为StudentDateComparator。然后您可以调用Collections.sort(yourList, new StudentDateComparator());`。
我通常更喜欢后者,因为它可以让我将排序代码与其排序的数据对象分开。
【讨论】:
如果 Student 类基于 ID 字段实现 Comparable,则使用 Collections.sort() 并将列表作为单个参数。
否则,实现一个使用对象 ID 比较对象的 Comparator,并将其用作 Collections.sort() 的第二个参数。
【讨论】:
你可以这样做:
要么让类实现Comparable:
public class Student implements Comparable<Student> {
private Date joinDate;
private String id;
//...
@Override
public int compareTo(Student o) {
int result = joinDate.compareTo(o.joinDate);
if(result != 0) {
return result;
}
return id.compareTo(o.id);
}
}
或者使用Comparator:
Comparator<Student> comparator = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int result = o1.getJoinDate().compareTo(o2.getJoinDate());
if (result != 0) {
return result;
}
return o1.getId().compareTo(o1.getId());
}
};
【讨论】: