Comparator的自定义排序

本文介绍了如何使用Comparator对文件进行排序,包括文件名的升序和降序,以及创建时间的升序和降序。同时,也讲解了Comparable接口在自定义排序中的应用,并对比了Comparator与Comparable的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、使用Comparator对文件进行排序(文件名字的升序、降序,创建时间的升序、降序)

1.bean类

public class FileListResult  {
    private String id;
    private String fileName;
    private String createTime;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
}

2.Comparator的实现类

private static class MyComparator implements Comparator<FileListResult>{
        int sortMode;
        public MyComparator(int sortMode) {
            this.sortMode=sortMode;
        }

        /**
         * @param o1 参与比较的list中的前一个元素
         * @param o2 参与比较的list中的后一个元素
         * @return 对象o1的属性与对象o2的属性相减(o1-o2)代表list升序排列,
         * 如(o1==o2、返回值为0,o1>o2、返回值为正数,o1<o2、返回值为负数);
         * 反之,则降序排列
         */
        @Override
        public int compare(FileListResult o1, FileListResult o2) {
            switch (sortMode) {
                case 0:
                    return cmpName(o1.getFileName(), o2.getFileName());
                case 1:
                    return cmpTime(o1.getCreateTime(), o2.getCreateTime());
            }
            return 0;
        }

        /**
         * 文件名字的升序
         */
        private int cmpName(String s1,String s2){
            if (s1==null||s2==null){
                return 0;
            }

            int len1=s1.length();
            int len2=s2.length();
            int lenMin=Math.min(len1,len2);

            for (int i = 0; i < lenMin; i++) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);
                if (c1 != c2) {
                    c1 = Character.toUpperCase(c1);
                    c2 = Character.toUpperCase(c2);
                    if (c1 != c2) {
                        c1 = Character.toLowerCase(c1);
                        c2 = Character.toLowerCase(c2);
                        if (c1 != c2) {
                            // No overflow because of numeric promotion
                            return c1 - c2;
                        }
                    }
                }
            }
            return  len1-len2;
        }

        /**
         *时间的升序
         */
        private int cmpTime(String s1,String s2){
            if (s1==null||s2==null){
                return 0;
            }

            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                long time1 = df.parse(s1).getTime();
                long time2 = df.parse(s2).getTime();
                return (int) (time1-time2);
            } catch (ParseException e) {
                return 0;
            }
        }

    }

3.MyComparator的使用

List<FileListResult> fileList = new ArrayList<>();
Comparator comparator=new MyComparator(0);
Collections.sort(fileList, comparator);//文件名字的升序排列
//文件名字的升序排列
Arrays.sort(((ArrayList) fileList).elementData, 0, fileList.size(), comparator);
//文件名字的降序排列
Collections.sort(fileList, Collections.reverseOrder(comparator));

二.Comparable的使用

1.类的声明

public class FileListResult implements Comparable {
    private String id;
    private String fileName;
    private String createTime;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    /**
     *bean的某个字段(文件名称)升序
     */
    @Override
    public int compareTo(@NonNull Object o) {
        if (o!=null){
            if (o instanceof FileListResult){
              return   getFileName().compareToIgnoreCase(((FileListResult) o).getFileName());
            }else {
                return 0;//不进行排序
            }
        }else {
            return 0;
        }
    }
}

2.类的引用

Collections.sort(fileList);//文件名称升序

(3)Comparator和Comparable的区别
Comparator:参与排序的字段定义在Comparator中,java提供了实现排序翻转(升序与降序的翻转)的api
Comparable:参与排序的字段定义在bean类中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值