在java里面,有时候我们可能需要对list集合中的对象的某个属性进行排序。这个问题就很简单了,Collections这个工具类提供了排序的方法,有两个重载方法,一个是只接受一个List集合,另一个是接受一个list和一个 Comparator接口。我这里以第二种为例讲解,后面在简单说明一下第一种,注意默认的顺序是升序排列。
在java api中可以看到 Comparator接口里面就一个方法,int compare(T o1, T o2),传入两个对象,关于返回值,有三种情况-1, 0, 1。-1表示o1小于o2,0表示o1等于o2,1表示o1大于o2。如果我们想要的就是升序排列,那就比较o1的o2属性,保证o1小于o2属性返回-1,o1等于o2的属性返回0,o1大于o2的属性返回1就行了,结果出来的就是升序的结集合了。还有可能想降序,那还不简单,小于返回1,大于返回-1,等于还是返回0就解决了。我们只需要明白一点,那就是程序只能通过这个compare方法返回的值来确定顺序,-1时o1排在前面,1时o1排在后面,0就不用动,Collections这个排序方法永远都是根据返回值“升序排列”。说的直白一点就是:compare方法返回-1时,表示o1排在o2的前面,返回1是表示o1排在o2的后面,至于什么情况返回-1还是1就根据业务需求来确定。
下面看个例子:
package com.pzn.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortListTest {
public static void main(String[] args) {
List<Per> list = new ArrayList<>();
list.add(new Per("a", "2015-11-10"));
list.add(new Per("b", "2015-10-10"));
list.add(new Per("c", "2015-09-10"));
list.add(new Per("d", "2015-11-02"));
list.add(new Per("e", "2015-10-13"));
// 升序
Collections.sort(list, new Comparator<Per>() {
public int compare(Per o1, Per o2) {
return o1.bir.compareTo(o2.bir);
}
});
System.out.println(list);
// 降序
Collections.sort(list, new Comparator<Per>() {
public int compare(Per o1, Per o2) {
return -o1.bir.compareTo(o2.bir);
}
});
System.out.println(list);
}
}
class Per {
// 不要问我这里为什么不写private,然后提供setter/getter方法,而用public。
// 是因为我写测试代码的时候偷懒,这段注释也是写博客的时候加的。
public final String name;
public final String bir;
public Per(String name, String bir) {
this.name = name;
this.bir = bir;
}
@Override
public String toString() {
return "Per [name=" + name + ", bir=" + bir + "]";
}
}
最后说说第一个排序方法,只需要传入list集合的那个方法,这个方法要求要排序的list集合中的对象所属的类要实现一个Comparable接口,可能也注意到了,上面代码中String的比较就是使用的一个
compareTo方法,这个方法就是来自Comparable接口,也就是说String实现了这个接口。