排序规则

因为是中国人,习惯性看中文文件夹放前面比较顺眼,所以在别人博客(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 list;

if (files == null) {

list = new ArrayList<>();

} else {

list = Arrays.asList(files);

}

Collections.sort(list, new Comparator() {

@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);

}

});

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐