ArrayList实现自定义排序主要通过两种方法
- 需要进行排序的对象类实现Comparable接口,重写compareTo(Object o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组。
- 实现比较器接口Comparator,重写compare方法,直接当做参数传进sort中
第一种方法实现。
首先定义一个对象类,并实现Comparable接口,然后重写compareTo(Object o)方法。
Student类
public class Student implements Comparable{
private String name;
private int age;
private String sex;
public Student(){}
/*
* 有参构造方法
*/
public Student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
/*
* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
* 比较年龄大小
*/
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Student s = (Student)o;
if(this.age>s.age){
return 1;
}else if(this.age<s.age){
return -1;
}
return 0;
}
}
测试方法
public class Sort {
public static void main(String[] args){
List<Student> list = new ArrayList<>();
list.add(new Student("bobby",24,"男"));
list.add(new Student("test",22,"男"));
list.add(new Student("tom",12,"男"));
list.add(new Student("bill",34,"男"));
list.add(new Student("lucy",54,"女"));
list.add(new Student("bear",29,"女"));
System.out.println("-----排序之前-----");
for(Student s:list){
System.out.println("姓名:"+s.getName()+"年龄:"+s.getAge()+"性别:"+s.getSex());
}
System.out.println("--------------");
Collections.sort(list);
System.out.println("-----排序之后-----");
for(Student s:list){
System.out.println("姓名:"+s.getName()+"年龄:"+s.getAge()+"性别:"+s.getSex());
}
}
}
输出结果
-----排序之前-----
姓名:bobby年龄:24性别:男
姓名:test年龄:22性别:男
姓名:tom年龄:12性别:男
姓名:bill年龄:34性别:男
姓名:lucy年龄:54性别:女
姓名:bear年龄:29性别:女
-------------------
-----排序之后-----
姓名:tom年龄:12性别:男
姓名:test年龄:22性别:男
姓名:bobby年龄:24性别:男
姓名:bear年龄:29性别:女
姓名:bill年龄:34性别:男
姓名:lucy年龄:54性别:女
第二种方法
实现比较器接口Comparator,重写compare方法,直接当做参数传进sort中。使用内部类的方法。
public static void main(String[] args){
List<Student> list = new ArrayList<>();
list.add(new Student("bobby",24,"男"));
list.add(new Student("test",22,"男"));
list.add(new Student("tom",12,"男"));
list.add(new Student("bill",34,"男"));
list.add(new Student("lucy",54,"女"));
list.add(new Student("bear",29,"女"));
System.out.println("-----未排序之前-----");
for(Student s:list){
System.out.println("姓名:"+s.getName()+"年龄:"+s.getAge()+"性别:"+s.getSex());
}
System.out.println("-------------------");
Collections.sort(list,new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
if(o1.getAge()>=o2.getAge()){
return 1;
}else{
return -1;
}
}
});
System.out.println("-----排序之后-----");
for(Student s:list){
System.out.println("姓名:"+s.getName()+"年龄:"+s.getAge()+"性别:"+s.getSex());
}
}
输出结果
-----未排序之前-----
姓名:bobby年龄:24性别:男
姓名:test年龄:22性别:男
姓名:tom年龄:12性别:男
姓名:bill年龄:34性别:男
姓名:lucy年龄:54性别:女
姓名:bear年龄:29性别:女
-------------------
-----排序之后-----
姓名:tom年龄:12性别:男
姓名:test年龄:22性别:男
姓名:bobby年龄:24性别:男
姓名:bear年龄:29性别:女
姓名:bill年龄:34性别:男
姓名:lucy年龄:54性别:女
总结
- Comparable通常用在类的内部比较,比如比较一个类的某个字段。
- Comparator也叫作外部比较器,通常是比较两个对象。