zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    CSS3点赞动画特效源码下载
    jQuery仿阿里云购买选择购买时间长度
    Ubuntu系统操作快捷键
    DIV+CSS颜色边框背景等样式
    HTML5翻页电子书
    淡蓝风格的手机登录HTML模板
    HTML常用符号
    SQL SERVER实例解析
    div+css页面右侧底部悬浮层
    C#引用C++代码
  • 原文地址:https://www.cnblogs.com/machi12/p/14490475.html
Copyright © 2011-2022 走看看