时间:2021/03/06
一.背景
最近做的算法排序题中有大佬是使用Collections类的sort方法实现的,感觉该方法在排序方面功能十分强大,就在这里总结一下具体的使用方法。
Collections类位于util包下,在该类中两个sort方法,这里我们使用的是有Comparator参数的sort方法,API文档中对该方法的解释如下:
从上面可以看出,sort方法的第一参数是list对象,第二个参数实现了Comparator接口的对象,该对象并需要重写compareTo方法,在该方法中定义了排序规则。
二.具体实现
这道题就是一个多排序问题,首先要根据运行时间进行排序,运行时间相同时再根据年:月:日进行排序,若前两个都相同,则根据分:秒:毫秒进行排序。我们的关键是通过实现Comparator类并重写compareTo方法来定义排序规则。注意:sort方法在排序时是按照从小到大进行的,若o1>o2,则应该返回1,若o1
这里sort方法的第二个参数我们使用的是匿名内部类的形式,泛型应该为要要比较对象的类型,如果这里泛型写为Object,则下面还要对参数进行强制类型转换。
具体代码:
importjava.util.Scanner;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;public classMain{public static voidmain(String[] args){//定义列表
Scanner in = newScanner(System.in);
ArrayList list = new ArrayList<>();//读取输入
while(in.hasNextLine()){
list.add(in.nextLine().trim());
}//进行排序,定义排序规则
Collections.sort(list, new Comparator(){public intcompare(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
}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);
}
}
}
原文:https://www.cnblogs.com/machi12/p/14490475.html