Loading

Java中Colllections类的sort参数Comparator的重写

 

时间: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);
        }
    }
}

 

posted @ 2021-03-06 14:05    阅读(435)  评论(0编辑  收藏  举报