Comparator的自定义排序

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

    1.文件详情的类
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));

(2)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;
    }

    /**
     *文件名称升序
     */
    @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:接口的实现类作为独立的一个类存在,能同时自定义多种字段(名字、时间)的排序和排序的逆转(升序与降序的转换);
Comparable:只能定义单一字段的比较。

(4)总结
Comparator对list的排序归根结底是对其中的元素按照数字类型的值进行排序。

猜你喜欢

转载自blog.csdn.net/qq_15116763/article/details/73740934