首页 > 代码库 > java List排序方法 Comparator和Comparable

java List排序方法 Comparator和Comparable

今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录。

Collections工具类中有两个方法可以对List进行排序,分别为:

  1. public static <T extends Comparable<? super T>> void sort(List<T> list)
  2. public static <T> void sort(List<T> list, Comparator<? super T> c)

从函数签名中可以看出,实现Comparable 或 Comparator接口 即可对List中的元素进行排序,测试代码如下,一看就明白

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class SortList {

    public static void main(String[] args) {
        List<Entry> ll = new LinkedList<Entry>();//此处可为ArrayList
        ll.add(new Entry(3));
        ll.add(new Entry(10));
        ll.add(new Entry(7));
        ll.add(new Entry(99));
        Collections.sort(ll, new Comparator<Entry>(){
            public int compare(Entry o1,Entry o2){
                if(o1.getA()<o2.getA()){
                    return -1;
                }
                else if(o1.getA()>o2.getA())
                    return 1;
                return 0;
            }
        });
        for(Entry t:ll){
            System.out.println(t.getA());
        }
    }

}

class Entry{

    private int a;

    public Entry(int a){
        this.a = a;
    }
    
    public int getA(){
        return a;
    }
}

运行结果为:

3
7
10
99

另外一种方法为:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class SortList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<Entry> ll = new LinkedList<Entry>();
        ll.add(new Entry(3));
        ll.add(new Entry(10));
        ll.add(new Entry(7));
        ll.add(new Entry(99));
        Collections.sort(ll);
        for(Entry t:ll){
            System.out.println(t.getA());
        }
    }

}

class Entry implements Comparable{

    private int a;

    public Entry(int a){
        this.a = a;
    }
    
    public int getA(){
        return a;
    }
    
    @Override
    public int compareTo(Object o) {
        Entry t = (Entry) o;
        if(this.a>t.a){
            return -1;
        }
        else if(this.a<t.a)
            return 1;
        else
            return 0;
    }
    
}

运行结果为:

99
10
7
3

两种方法的效果都是一样的,不过使用Comparator接口的话,可以实现排序算法和业务逻辑相分离。对于一些已经实现的类也可以用Comparator来实现排序,而无需修改已实现的类。