文档章节

Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先

她叫我小渝
 她叫我小渝
发布于 2018/11/14 18:45
字数 481
阅读 44
收藏 0

排序规则

因为是中国人,习惯性看中文文件夹放前面比较顺眼,所以在别人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基础上,加上了自己的排序规则。

默认排序规则是按照ASCII码表排序(http://ascii.911cha.com/),排序的步骤大概是:部分符号->数字->部分符号->大写字母->部分符号->小写字母->部分符号->中文。

所以我修改了逻辑,排序变成:中文->数字->字母(不区分大小写)->特殊字符

算法原理

1、将字符串不区分大小写

2、把字符串中的中文变成拼音的首字母

3、识别字符串的第一个字符,如果是中文则在前面加上字符“.”,用于在compareTo方法中,排在数字前面

4、识别字符串的第一个字符,如果是符号(看ASCII表)则在前面加上字符“{”,用于在compareTo方法中,排在Z后面

代码

代码就不上注释了,也比较简单

        File[] files = new File(path).listFiles();
        List<File> list;
        if (files == null) {
            list = new ArrayList<>();
        } else {
            list = Arrays.asList(files);
        }
        Collections.sort(list, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                if (o1.isDirectory() && o2.isFile())
                    return -1;
                if (o1.isFile() && o2.isDirectory())
                    return 1;
                String name1 = o1.getName().toUpperCase();
                char c1 = name1.toCharArray()[0];
                String name11 = "";
                for (char c11 : name1.toCharArray()) {
                    name11 += Pinyin.toPinyin(c11);
                }

                if (c1 >= 0x4E00 && c1 <= 0x9FA5) {
                    name1 = "." + name11;
                } else if (c1 < 48) {
                    name1 = "{" + name11;
                } else if (c1 > 57 && c1 < 65) {
                    name1 = "{" + name11;
                }

                String name2 = o2.getName().toUpperCase();

                char c2 = name2.toCharArray()[0];

                String name22 = "";
                for (char c22 : name2.toCharArray()) {
                    name22 += Pinyin.toPinyin(c22);
                }

                if (c2 >= 0x4E00 && c2 <= 0x9FA5) {
                    name2 = "." + name22;
                } else if (c2 < 48) {
                    name2 = "{" + name22;
                } else if (c2 > 57 && c2 < 65) {
                    name2 = "{" + name22;
                }
                return name1.compareTo(name2);
            }
        });

 

© 著作权归作者所有

她叫我小渝
粉丝 8
博文 61
码字总数 46989
作品 0
深圳
Android工程师
私信 提问
AndroidStudio开发Java工程(解决java控制台中文打印乱码+导入jar包运行工程)

这篇分享一点个人AS开发java工程经验,虽然有时候还是得打开eclipse来运行java项目,但能用AS的时候还是尽量用AS,毕竟一个字,爽~ 废话不多说,进入正题。 一、开发Java工程 你有两种选择,...

cczheng
2018/12/10
0
0
Android中的资源与国际化-----

我们主要看一下layout与values目录,layout里的xml文件的我们应用使用布局的文件,values里的sring.xml是用来存放文字资源,一个key对应一个value值。 但是在实际应用开发中,通常横屏(land)与...

android自学
2018/07/28
0
0
Android 第三课——项目结构及作用

● src—包含项目的.java源文件。 在本例中, 有一个文件:HelloWorldActivity.java。HelloWorld Activity.java文件是活动的源文件,您将在这个文件中编写应用程序的代码。这个Java文件在项目...

learn_more
2014/12/30
214
0
cocos2d-x3.2 在Windows下打包Android平台APK

一、下载Android环境 搭建Android环境需要用到Android SDK、NDK、Ant和JDK; 下载Android SDK  下载Android NDk 下载Android JDK 下载Ant 其中JDK是需要安装的,其他的都直接解压即可。将S...

_子墨
2014/11/29
36.2K
2
Unity2018.2中文更新日志速览版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/81036150 本文首发于洪流学堂微信公众号。 洪流学堂,学Unity快人几步 Unity2...

关尔Manic
2018/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
50分钟前
3
0
Kafka 2.3 Producer (0.9以后版本适用)

kafka0.9版本以后用java重新编写了producer,废除了原来scala编写的版本。 这里直接使用最新2.3版本,0.9以后的版本都适用。 注意引用的包为:org.apache.kafka.clients.producer import ja...

实时计算
59分钟前
3
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
14
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部