前言
- 本文使用环境为JDK8
- sort()方法底层采用归并排序,时间复杂度为O(nlgn),空间复杂度为O(n),感兴趣的同学自行查阅源码,本文仅说明使用sort()方法进行自定义排序时的注意点
代码
public class Test {
static class Node{
String data;
String seq;
public Node(String data, String seq) {
this.data = data;
this.seq = seq;
}
@Override
public String toString() {
return "Node{" +
"data='" + data + '\'' +
", seq='" + seq + '\'' +
'}';
}
}
public static void main(String[] args) {
List<Node> nodeList = new ArrayList<>();
nodeList.add(new Node("d","1"));
nodeList.add(new Node("e","2"));
nodeList.add(new Node("e","3"));
nodeList.add(new Node("d","4"));
//以下写法仅为示例
//故意返回 1 0 -1
//以下为求自定义的升序,这里认为data=“e”应该排在data="d"前面
nodeList.sort(new Comparator<Node>() {
//这里有一个注意点
//入参o1在nodeList中的位置不一定在o2前面
//这里仅仅代表两个入参
@Override
public int compare(Node o1, Node o2) {
if (o1.data.compareTo(o2.data)>0){
//返回大于0的整型代表o1大于o2,o2应该排在o1前面
return 1;
}else if(o1.data.compareTo(o2.data)==0){
//返回0代表o1等于o2,o1和o2不需要改变位置
return 0;
}else{
//返回小于0的整型代表o1小于o2,o1应该排在o2
return -1;
}
}
});
for (Node node:nodeList){
System.out.println(node);
}
}
}
输出
Node{data=‘d’, seq=‘1’}
Node{data=‘d’, seq=‘4’}
Node{data=‘e’, seq=‘2’}
Node{data=‘e’, seq=‘3’}
总结
- 入参o1在列表中的位置不一定在o2前面
- compare方法返回大于0的整型代表o1大于o2,o2应该排在o1前面
- compare方法返回0代表o1等于o2,o1和o2不需要改变位置
- compare方法返回小于0的整型代表o1小于o2,o1应该排在o2