时间:2021/03/06
一.背景
最近做的算法排序题中有大佬是使用Collections类的sort方法实现的,感觉该方法在排序方面功能十分强大,就在这里总结一下具体的使用方法。
Collections类位于util包下,在该类中两个sort方法,这里我们使用的是有Comparator参数的sort方法,API文档中对该方法的解释如下:
从上面可以看出,sort方法的第一参数是list对象,第二个参数实现了Comparator接口的对象,该对象并需要重写compareTo方法,在该方法中定义了排序规则。
参考博文:https://blog.csdn.net/yongh701/article/details/44131051
二.具体实现
这里我们以一道OJ题为例进行讲解,题目链接:https://www.nowcoder.com/practice/0f64518fea254c0187ccf0ea05019672?tpId=40&tqId=21363&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey
这道题就是一个多排序问题,首先要根据运行时间进行排序,运行时间相同时再根据年:月:日进行排序,若前两个都相同,则根据分:秒:毫秒进行排序。我们的关键是通过实现Comparator类并重写compareTo方法来定义排序规则。注意:sort方法在排序时是按照从小到大进行的,若o1>o2,则应该返回1,若o1<o2,则应该返回-1,若o1=o2,则应该返回0。String类本身已经重写compareTo方法了。
这里sort方法的第二个参数我们使用的是匿名内部类的形式,泛型应该为要要比较对象的类型,如果这里泛型写为Object,则下面还要对参数进行强制类型转换。
具体代码:
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Main{ public static void main(String[] args){ //定义列表 Scanner in = new Scanner(System.in); ArrayList<String> list = new ArrayList<>(); //读取输入 while(in.hasNextLine()){ list.add(in.nextLine().trim()); } //进行排序,定义排序规则 Collections.sort(list, new Comparator<String>(){ public int compare(String s1, String s2){ String[] str1 = s1.split("\\s+"); String[] str2 = s2.split("\\s+"); //由于时间的长度不一致,所以不能直接比较字符串 double time1 = Double.parseDouble(str1[3].substring(0, str1[3].length() - 3)); double time2 = Double.parseDouble(str2[3].substring(0, str2[3].length() - 3)); if(time1 > time2){ return 1; }else if(time1 < time2){ return -1; } else{ if(!str1[1].equals(str2[1])){ return str1[1].compareTo(str2[1]); } else{ return str1[2].compareTo(str2[2]); } } } }); //输出排序结果 for(String item : list){ System.out.println(item); } } }