Comparable 和 Comparator都是用于对象排序的接口,但是使用方法稍有差异。
对象的排序通常使用两种方法可操作:
1、Collections.sort(参数一);
2、Collections.sort(参数一,参数二);
使用第一种方法参数一集合中的对象必须实现Comparable 接口且 覆写compareTo()方法,compareTo方法中描述了如何对两个对象比较大小。
使用第二种方法集合中的对象不必实现任何接口,只需在参数二中描述一个Comparator的实现类,告诉如何对集合中对象比较大小。
使用Collections.sort(参数一)排序的实例如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class CourseCompare implements Comparable<CourseCompare>{
/**
*课程ID
*/
private Integer courseId;
/**
*课程编号
*/
private Integer courseNumber;
/**
*课程名称
*/
private String courseName;
/**
*课程任课教师
*/
private Integer teacherId;
@Override
public int compareTo(CourseCompare o) {
return Integer.compare(this.courseNumber,o.getCourseNumber());
}
}
private static void test1() {
List<CourseCompare> courses = new ArrayList<>();
courses.add(new CourseCompare(1,1,"语文",1));
courses.add(new CourseCompare(2,4,"数学",2));
courses.add(new CourseCompare(3,3,"化学",3));
courses.add(new CourseCompare(4,2,"物理",4));
Collections.sort(courses);
courses.forEach(System.out::println);
}
使用Collections.sort(参数一,参数二)排序的如下:
@NoArgsConstructor
@AllArgsConstructor
@Data
@Accessors(chain = true)
public class Course {
/**
*课程ID
*/
private Integer courseId;
/**
*课程编号
*/
private Integer courseNumber;
/**
*课程名称
*/
private String courseName;
/**
*课程任课教师
*/
private Integer teacherId;
}
private static void test2() {
List<CourseCompare> courses = new ArrayList<>();
courses.add(new CourseCompare(1,1,"语文",1));
courses.add(new CourseCompare(2,4,"数学",2));
courses.add(new CourseCompare(3,3,"化学",3));
courses.add(new CourseCompare(4,2,"物理",4));
Collections.sort(courses, new Comparator<CourseCompare>() {
@Override
public int compare(CourseCompare o1, CourseCompare o2) {
return o1.getCourseNumber()-o2.getCourseNumber();
}
});
courses.forEach(System.out::println);
}
结论:Comparator排序对对象入侵小,使用灵活,开发中应优先使用。