文档章节

Java实现的中文文件名排序

孟飞阳
 孟飞阳
发布于 2016/07/11 09:51
字数 575
阅读 127
收藏 0

中文字符串排序肯定要用到中文排序的Comparator,幸运的是,java有提供这样的Comparator。

获取方法:

Collator.getInstance(java.util.Locale.CHINA);

下面是,自己封装的一个文件排序的类,有四种排序方法。

 

package com.test;

import java.io.File;
import java.sql.Date;
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;

public class FileSorter implements Comparator<File>{
    /**默认排序的方式, 按目录,文件排序TYPE_DIR*/
    public static final int TYPE_DEFAULT             = -1;
    /**按修改时间,降序*/
    public static final int TYPE_MODIFIED_DATE_DOWN = 1;
    /**按修改时间,升序*/
    public static final int TYPE_MODIFIED_DATE_UP    = 2;
    /**按文件大小,降序*/
    public static final int TYPE_SIZE_DOWN            = 3;
    /**按文件大小,升序*/
    public static final int TYPE_SIZE_UP            = 4;
/*  public static final int TYPE_NAME_DOWN            = 5;
    public static final int TYPE_NAME_UP            = 6;*/
    /**按文件名*/
    public static final int TYPE_NAME                 = 5;
    /**按目录,文件排序*/
    public static final int TYPE_DIR                = 7;
   
    private int mType = -1;
   
    public FileSorter(int type) {
        if (type < 0 || type > 7) {
            type = TYPE_DIR;
        }
        mType = type;
    }
    @Override
    public int compare(File object1, File object2) {
       
        int result = 0;
       
        switch (mType) {
       
        case TYPE_MODIFIED_DATE_DOWN://last modified date down
            result = compareByModifiedDateDown(object1, object2);
            break;
           
        case TYPE_MODIFIED_DATE_UP://last modified date up
            result = compareByModifiedDateUp(object1, object2);
            break;
           
        case TYPE_SIZE_DOWN:    // file size down
            result = compareBySizeDown(object1, object2);
            break;
           
        case TYPE_SIZE_UP:        //file size up
            result = compareBySizeUp(object1, object2);
            break;
           
        case TYPE_NAME:            //name
            result = compareByName(object1, object2);
            break;
           
        case TYPE_DIR:            //dir or file
            result = compareByDir(object1, object2);
            break;
        default:
            result = compareByDir(object1, object2);
            break;
        }
        return result;
    }
    private int compareByModifiedDateDown(File object1, File object2) {
       
        long d1 = object1.lastModified();
        long d2 = object2.lastModified();
       
        if (d1 == d2){
            return 0;
        } else {
            return d1 < d2 ? 1 : -1;
        }
    }
    private int compareByModifiedDateUp(File object1, File object2) {
       
        long d1 = object1.lastModified();
        long d2 = object2.lastModified();
       
        if (d1 == d2){
            return 0;
        } else {
            return d1 > d2 ? 1 : -1;
        }
    }
    private int compareBySizeDown(File object1, File object2) {
       
        if (object1.isDirectory() && object2.isDirectory()) {
            return 0;
        }
        if (object1.isDirectory() && object2.isFile()) {
            return -1;
        }
        if (object1.isFile() && object2.isDirectory()) {
            return 1;
        }
        long s1 = object1.length();
        long s2 = object2.length();
       
        if (s1 == s2){
            return 0;
        } else {
            return s1 < s2 ? 1 : -1;
        }
    }
    private int compareBySizeUp(File object1, File object2) {
       
        if (object1.isDirectory() && object2.isDirectory()) {
            return 0;
        }
        if (object1.isDirectory() && object2.isFile()) {
            return -1;
        }
        if (object1.isFile() && object2.isDirectory()) {
            return 1;
        }
       
        long s1 = object1.length();
        long s2 = object2.length();
       
        if (s1 == s2){
            return 0;
        } else {
            return s1 > s2 ? 1 : -1;
        }
    }
    private int compareByName(File object1, File object2) {
       
        Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
       
        return cmp.compare(object1.getName(), object2.getName());
    }
    private int compareByDir(File object1, File object2) {
       
        if (object1.isDirectory() && object2.isFile()) {
            return -1;
        } else if (object1.isDirectory() && object2.isDirectory()) {
            return compareByName(object1, object2);
        } else if (object1.isFile() && object2.isDirectory()) {
            return 1;
        } else {  //object1.isFile() && object2.isFile())
            return compareByName(object1, object2);
        }
    }
    //for test
    public static void main(String[] args){
        
        File[] list = new File("/usr").listFiles();
        Arrays.sort(list, new FileSorter(FileSorter.TYPE_SIZE_UP));
        printFileArray(list);
    }
    //for test
    private static void printFileArray(File[] list) {
       
        System.out.println("文件大小\t\t文件修改日期\t\t文件类型\t\t文件名称");
       
        for (File f : list) {
            System.out.println(f.length() + "\t\t" + new Date(f.lastModified()).toString() + "\t\t" + (f.isDirectory() ? "目录" : "文件") + "\t\t" +  f.getName() );
        }
    }
   
}

 

© 著作权归作者所有

孟飞阳
粉丝 217
博文 1056
码字总数 566359
作品 5
朝阳
个人站长
私信 提问
[转] netbeans 界面美化与字体设置

中文 Windows 下面,NetBeans 默认的界面和字体实在有点丑,得优化一下。 安装最新的 JDK 必须安装 Java SE Development Kit (JDK) 6 Update 10 或更新的版本,早期版本对字体反锯齿支持不好...

dodojava
2011/06/05
2K
1
response.setHeader()下载中文文件名乱码问题

HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connection , Data , Pragma , Trailer , ...

Dicky
2011/10/25
1K
0
Apache Ant 调用 properties 中文乱码问题

之前写了个ant的xml,其中打包之后的文件名是中文文件名,于是写入build.properties里读取,结果发现读取出来的是一堆乱码,于是上网找了下,才知道原来要把 中文字符转化成Unicode编码方式才...

鉴客
2011/12/21
2.4K
0
response.setHeader()的用法 (转别人转的)

response.setHeader()下载中文文件名乱码问题 收藏 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cac...

yifon
2014/04/19
145
0
【我的Android进阶之旅】Android实现中文汉字笔划(笔画)排序、中文拼音排序、英文排序的国家地区选择界面

版权声明:本文为【欧阳鹏】原创文章,欢迎转载,转载请注明出处! 【http://blog.csdn.net/ouyang_peng】 https://blog.csdn.net/qq446282412/article/details/84109727 一、需求描述 最近要...

欧阳鹏
2018/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
19分钟前
3
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
19分钟前
3
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
21分钟前
3
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
24分钟前
4
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
25分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部