java 文件排序

对目录文件进行排序

基本函数

1、按名字中文拼音字母排序

/**
     * 根据中文拼音字母排列,且先中文,后英文
     * 
     * @param files, 文件列表
     */
    public static void sortNameInChina(List<File> files) {
        Collections.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
                return cmp.compare(o1.getName(), o2.getName());
            }
        });
    }


2、按后缀排序

/**
     * 根据后缀排列
     * 
     * @param files, 文件列表
     */
    public static void sortBySuffix(List<File> files) {
        Collections.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
                String name1 = o1.getName();
                String name2 = o2.getName();
                return cmp.compare(name1.substring(name1.lastIndexOf(".")), name2.substring(name2.lastIndexOf(".")));
            }
        });
    }



一、按名字排序

 /**
     * 按照文件名称排序
     * @param files ,所有文件(夹)
     * @return 排序后的文件(夹)
     */
    public static List<File> orderByName(List<File> files) {

        List<File> justPaths = new ArrayList<File>();
        List<File> justFiles = new ArrayList<File>();
        List<File> fileLists = new ArrayList<File>();

        for (File file : files) {
            if (file.isDirectory()) {
                justPaths.add(file);
            } else {
                justFiles.add(file);
            }
        }

        // 目录按名称排序
        sortNameInChina(justPaths);
        // 文件按名称排序
        sortNameInChina(justFiles);

        fileLists.addAll(justPaths);
        fileLists.addAll(justFiles);
        
//  System.out.println("filelists:" + fileLists); 这样打印会导致下面的错误
//GC_CONCURRENT freed 1593K, 40% free 8450K/13955K, paused 274ms+265ms, total 623ms
        return fileLists;
       
    }


二、按大小排序

/**
     * 按照文件大小排序,文件夹只是按名称排序,文件按大小排序
     * @param files ,所有文件(夹)
     * @return 排序后的文件(夹)
     */
    public static List<File> orderByLength(List<File> files) {
        
        List<File> justPaths = new ArrayList<File>();
        List<File> justFiles = new ArrayList<File>();
        List<File> fileLists = new ArrayList<File>();

        for (File file : files) {
            if (file.isDirectory()) {
                justPaths.add(file);
            } else {
                justFiles.add(file);
            }
        }

        // 目录按名称排序
        sortNameInChina(justPaths);

        // 文件按大小排序
        Collections.sort(justFiles, new Comparator<File>() {
            public int compare(File f1, File f2) {
                long diff = f1.length() - f2.length();
                if (diff > 0)
                    return 1;
                else if (diff == 0)
                    return 0;
                else
                    return -1;
            }
            public boolean equals(Object obj) {
                return true;
            }
        });

        fileLists.addAll(justPaths);
        fileLists.addAll(justFiles);
        
        for (File file:fileLists) {
            System.out.println("file name:" + file.getName());
        }
        
        return fileLists;
        
    }



三、按时间排序

/**
     * 按照文件大小排序,文件夹只是按名称排序,文件按大小排序
     * @param files ,所有文件(夹)
     * @return 排序后的文件(夹)
     */
    public static List<File> orderByLength(List<File> files) {
        
        List<File> justPaths = new ArrayList<File>();
        List<File> justFiles = new ArrayList<File>();
        List<File> fileLists = new ArrayList<File>();

        for (File file : files) {
            if (file.isDirectory()) {
                justPaths.add(file);
            } else {
                justFiles.add(file);
            }
        }

        // 目录按名称排序
        sortNameInChina(justPaths);

        // 文件按大小排序
        Collections.sort(justFiles, new Comparator<File>() {
            public int compare(File f1, File f2) {
                long diff = f1.length() - f2.length();
                if (diff > 0)
                    return 1;
                else if (diff == 0)
                    return 0;
                else
                    return -1;
            }
            public boolean equals(Object obj) {
                return true;
            }
        });

        fileLists.addAll(justPaths);
        fileLists.addAll(justFiles);
        
        for (File file:fileLists) {
            System.out.println("file name:" + file.getName());
        }
        
        return fileLists;
        
    }



四、按类型排序

1、

/**
     * 按文件类型排序
     * @param files ,所有文件(夹)
     * @return 排序后的文件(夹)
     */
    public static List<File> orderByType(List<File> files) {

        List<File> justPaths = new ArrayList<File>();
        List<File> suffixFiles = new ArrayList<File>();
        List<File> noSuffixFiles = new ArrayList<File>();
        List<File> fileLists = new ArrayList<File>();

        for (File file : files) {
            if (file.isDirectory()) {
                justPaths.add(file);
            } else {
                if (file.getName().indexOf(".") != -1) {
                    suffixFiles.add(file);
                } else {
                    noSuffixFiles.add(file);               
                }  
            }
        }
        
        sortNameInChina(justPaths);
        sortNameInChina(suffixFiles);
        sortBySuffix(suffixFiles);
        sortNameInChina(noSuffixFiles);
       
        fileLists.addAll(justPaths);
        fileLists.addAll(suffixFiles);
        fileLists.addAll(noSuffixFiles);
       
//        System.out.println("filelists:" + fileLists);
        return fileLists;
    }


2、

/**
     * 按文件类型排序
     * @param files ,所有文件(夹)
     * @return 排序后的文件(夹)
     */
    public static List<File> orderByType(List<File> files) {

        List<File> justPaths = new ArrayList<File>();
        List<File> justFiles = new ArrayList<File>();

        List<File> videoFiles = new ArrayList<File>();
        List<File> musicFiles = new ArrayList<File>();
        List<File> photoFiles = new ArrayList<File>();
        List<File> pdfFiles = new ArrayList<File>();
        List<File> docFiles = new ArrayList<File>();
        List<File> xlsFiles = new ArrayList<File>();
        List<File> pptFiles = new ArrayList<File>();
        List<File> apkFiles = new ArrayList<File>();
        List<File> htmlFiles = new ArrayList<File>();
        List<File> torrentFiles = new ArrayList<File>();
        List<File> otherFiles = new ArrayList<File>();

        List<File> fileLists = new ArrayList<File>();

        for (File file : files) {
            if (file.isDirectory()) {
                justPaths.add(file);
            } else {
                justFiles.add(file);
            }
        }

        for (File file : files) {
            String filename = file.getName();
            if (isVideo(filename))
                videoFiles.add(file);
            else if (isMusic(filename))
                musicFiles.add(file);
            else if (isPhoto(filename))
                photoFiles.add(file);
            else if (isApk(filename))
                apkFiles.add(file);
            else if (isHtml(filename))
                htmlFiles.add(file);
            else if (isPdf(filename))
                pdfFiles.add(file);
            else if (isDoc(filename))
                docFiles.add(file);
            else if (isPpt(filename))
                pptFiles.add(file);
            else if (isXls(filename))
                xlsFiles.add(file);
            else if (isTorrent(filename))
                torrentFiles.add(file);
            else
                otherFiles.add(file);
        }

        sortNameInChina(justPaths);
        sortNameInChina(photoFiles);
        sortNameInChina(musicFiles);
        sortNameInChina(videoFiles);
        sortNameInChina(apkFiles);
        sortNameInChina(htmlFiles);
        sortNameInChina(pdfFiles);
        sortNameInChina(docFiles);
        sortNameInChina(xlsFiles);
        sortNameInChina(pptFiles);
        sortNameInChina(torrentFiles);
        sortNameInChina(otherFiles);

        fileLists.addAll(justPaths);
        fileLists.addAll(photoFiles);
        fileLists.addAll(musicFiles);
        fileLists.addAll(videoFiles);
        fileLists.addAll(apkFiles);
        fileLists.addAll(htmlFiles);
        fileLists.addAll(pdfFiles);
        fileLists.addAll(docFiles);
        fileLists.addAll(xlsFiles);
        fileLists.addAll(pptFiles);
        fileLists.addAll(torrentFiles);
        fileLists.addAll(otherFiles);

        return fileLists;
        
    }



五、快速排序

/**
     * 快速排序
     * @param targetArr 文件列表
     * @param start     开始位置
     * @param end       结束位置
     * @param sortType  排序类型
     * @return
     */ 
    public static List<File> quickSort(List<File> targetArr, int start,
            int end, int sortType) {
        if (targetArr.size() == 0)
            return targetArr;
        int i = start, j = end;
        File key = targetArr.get(start);
        switch (sortType) {
            //by size
            case 1 :
                while (i < j) {              
                    while (j > i && ((targetArr.get(j).length() - key.length()) >= 0 )) {
                        j--;
                    }

                    if (i < j) {
                        targetArr.set(i, targetArr.get(j));
                    }

                    while (i < j && ((targetArr.get(i).length() - key.length()) <= 0 )) {
                        i++;
                    }

                    if (i < j) {
                        targetArr.set(j, targetArr.get(i));
                    }
                }
                break;
                
            //by type(with suffix)
            case 2 :
                while (i < j) {
                    while (j > i && ((targetArr.get(j).getName().substring(targetArr.get(j).getName().lastIndexOf(".")).compareToIgnoreCase
                            (key.getName().substring(key.getName().lastIndexOf("."))) >= 0 ))) {
                        j--;
                    }

                    if (i < j) {
                        targetArr.set(i, targetArr.get(j));
                    }

                    while (i < j && ((targetArr.get(i).getName().substring(targetArr.get(i).getName().lastIndexOf(".")).compareToIgnoreCase
                            (key.getName().substring(key.getName().lastIndexOf("."))) <= 0 ))) {
                        i++;
                    }

                    if (i < j) {
                        targetArr.set(j, targetArr.get(i));
                    }
                }
  
                break;
                
            //by time
            case 3 :
                while (i < j) {              
                    while (j > i && ((targetArr.get(j).lastModified() - key.lastModified()) >= 0 )) {
                        j--;
                    }

                    if (i < j) {
                        targetArr.set(i, targetArr.get(j));
                    }

                    while (i < j && ((targetArr.get(i).lastModified() - key.lastModified()) <= 0 )) {
                        i++;
                    }

                    if (i < j) {
                        targetArr.set(j, targetArr.get(i));
                    }
                }
                break;
                
            //by name
            default :
                Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
                while (i < j) {
                    // 按j--方向遍历目标数组,直到比key小的值为止
                    while (j > i
                            && cmp.compare(targetArr.get(j).getName(),
                                    key.getName()) >= 0) {
                        j--;
                    }

                    if (i < j) {
                        // targetArr[i]已经保存在key中,可将后面的数填入
                        targetArr.set(i, targetArr.get(j));
                    }


                    // 按i++方向遍历目标数组,直到比key大的值为止
                    while (i < j
                            && cmp.compare(targetArr.get(i).getName(),
                                    key.getName()) <= 0) {// 此处一定要小于等于零,假设数组之内有一亿个1,0交替出现的话,而key的值又恰巧是1的话,那么这个小于等于的作用就会使下面的if语句少执行一亿次。
                        i++;
                    }

                    if (i < j) {
                        // targetArr[j]已保存在targetArr[i]中,可将前面的值填入
                        targetArr.set(j, targetArr.get(i));
                    }
                }
                break;
        }

        // 此时i==j
        targetArr.set(i, key);

        if (i - start > 1) {
            // 递归调用,把key前面的完成排序
            quickSort(targetArr, start, i - 1, sortType);
        }
        if (end - j > 1) {
            // 递归调用,把key后面的完成排序
            quickSort(targetArr, j + 1, end, sortType);
        }

        return targetArr;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值