对自定义的对象属性进行排序,一般是实现Comparable接口或实现Comparator接口
1. Comparable与Comparator接口的区别
参数 | Comparable | Comparator |
---|---|---|
排序逻辑 | 排序逻辑必须在待排序对象的类(pojo类)中 | 排序逻辑单独实现 |
实现 | pojo类实现Comparable接口 | 自定义Comparator接口 |
排序方法 | int compareTo(Object o1) | int compare(Object o1, Object o2) |
触发排序 | Collections.sort(List) | Collections.sort(List, Comparator) |
接口所在包 | java.lang.Comparable | java.util.Comparator |
巧记两个接口:
Comparator:-tor结尾,类似doctor一样代表一个人,可以想象为是一个独立的排序接口个体,因为是个比较器个体,所以需要单独书写,单独调用;
Comparable:-able结尾,able代表xxx能力,描述自身具有的一种能力,是自身自带排序,所以不需要单独写但是要嵌入Bean中,使得Bean具有排序能力
2. 实现***Comparator***接口
package CollectionKnowledge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 集合自定义属性升序排序示例
* @author sunlh
*
*/
public class ComparatorSort {
public static void main(String[] args) {
List<UserBean> list = new ArrayList<>();
UserBean user1 = new UserBean("2", "张三", "男", 23);
UserBean user2 = new UserBean("4", "李四", "男", 24);
UserBean user3 = new UserBean("3", "王五", "男", 25);
UserBean user4 = new UserBean("1", "马六", "男", 26);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("排序前数据");
for (UserBean userBean : list)
System.out.println(userBean.toString());
System.out.println("排序后数据");
// 调用排序方法,进行排序
ComparatorSort.sortById(list);
for (UserBean userBean : list)
System.out.println(userBean.toString());
}
/**
* 按照集合id升序排序
* @param list
*/
public static void sortById(List<UserBean> list) {
Collections.sort(list, new Comparator<UserBean>() {
@Override
public int compare(UserBean u1, UserBean u2) {
String id1 = u1.getId();
String id2 = u2.getId();
return id1.compareToIgnoreCase(id2);// 忽略大小写进行升序排序
}
});
}
}
/**
* 用户pojo
* @author sunlh
*
*/
class UserBean{
private String id;
private String name;
private String sex;
private int age;
public UserBean(String id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public UserBean() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
+ ", age=" + age + "]";
}
}
输出结果:
排序前数据
UserBean [id=2, name=张三, sex=男, age=23]
UserBean [id=4, name=李四, sex=男, age=24]
UserBean [id=3, name=王五, sex=男, age=25]
UserBean [id=1, name=马六, sex=男, age=26]
排序后数据
UserBean [id=1, name=马六, sex=男, age=26]
UserBean [id=2, name=张三, sex=男, age=23]
UserBean [id=3, name=王五, sex=男, age=25]
UserBean [id=4, name=李四, sex=男, age=24]
3. 实现***Comparable***接口
package CollectionKnowledge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ComparableSort {
public static void main(String[] args) {
List<UserBean2> list = new ArrayList<>();
UserBean2 user1 = new UserBean2("2", "张三", "男", 23);
UserBean2 user2 = new UserBean2("4", "李四", "男", 24);
UserBean2 user3 = new UserBean2("3", "王五", "男", 25);
UserBean2 user4 = new UserBean2("1", "马六", "男", 26);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("排序前数据");
for (UserBean2 userBean2 : list)
System.out.println(userBean2.toString());
System.out.println("排序后数据");
Collections.sort(list);
for (UserBean2 userBean2 : list)
System.out.println(userBean2.toString());
}
}
/**
* 用户pojo
* @author sunlh
*
*/
class UserBean2 implements Comparable<UserBean2>{
private String id;
private String name;
private String sex;
private int age;
public UserBean2(String id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public UserBean2() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
+ ", age=" + age + "]";
}
@Override
public int compareTo(UserBean2 o) {
return this.id.compareToIgnoreCase(o.getId());
}
}
输出结果(同上面一样):
排序前数据
UserBean [id=2, name=张三, sex=男, age=23]
UserBean [id=4, name=李四, sex=男, age=24]
UserBean [id=3, name=王五, sex=男, age=25]
UserBean [id=1, name=马六, sex=男, age=26]
排序后数据
UserBean [id=1, name=马六, sex=男, age=26]
UserBean [id=2, name=张三, sex=男, age=23]
UserBean [id=3, name=王五, sex=男, age=25]
UserBean [id=4, name=李四, sex=男, age=24]