一天张三、李四的同事周五接到王哥的一个任务需求,有一个文件夹,里面有许多图片文件,网页访问某个分类展示文件的时候,王哥希望文件名的展示顺序可以按照Windows资源管理器中文件名升序排序的方式展示。
网站图片目录中有如下图片
1_rain.jpg
2_rain.jpg
3_rain.jpg
10_snow.jpg
11_snow.jpg
12_snow.jpg
7_wind1.jpg
7_wind2.jpg
8_wind.jpg
18_sky.jpg
18_sky_blue.jpg
boy1.jpg
boy2.jpg
1_girl1.jpg
1_girl2.jpg
在Windows文件夹中的升序展示顺序如下:
周五看了看,心想这个调用java.io包中File.listFiles()方法,返回应该也是这个顺序吧,可是如果就这样是不是太简单了?
随后周五编码如下
void paixu(){
String sucai = "d:\\sucai"
File file = new File(sucai);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
}
}
执行后输出顺序如下:
“果然和Windows的文件夹排序不一致,我就说王哥不能把这么简单的任务交给我。”
随后周五用搜索引擎找了好久,也找到了一个Java版本的例子,一个JavaScript版本的例子,但例子都说的模棱两可,还是没搞太明白,没能学以致用。只知道Windows的这种排序方式叫做natural order,自然序,这种排序看上去比较符合人类的直觉。
眼看这一天要下班了,他去找了同事张三,说明了自己的困难,张三帮他看了半天,思索了良久,说:“小五啊,不是你三哥不愿意帮你,实在是我水平有限……”
由于时间快下班了,周五有点着急,“我的好三哥,水平有限,你不早说,还在我这看半天”,
“你别急啊,我这不还没说完呢,李四,你四哥,他水平高,你去找他试试”
周五双手合十,“三哥,原谅我有些着急,我去找李四”
周五工位前,李四看着屏幕沉思着,
“怎么样?四哥,这个问题好解决吗?”
“嗯,也好,也不好”
“啊?好怎么理解,不好怎么理解。”
“你晚上请我吃饭,问题就好解决。你不请我吃饭,问题就不好解决。”
“晚饭我请了,地点你定,怎么样?”
“咱可得说话算数”
“一口吐沫一个钉”
说完,李四拿起键盘一顿输出,随后按下shift + F10运行。
控制台输出如下:
1_girl1.jpg
1_girl2.jpg
1_rain.jpg
2_rain.jpg
3_rain.jpg
7_wind1.jpg
7_wind2.jpg
8_wind.jpg
10_snow.jpg
11_snow.jpg
12_snow.jpg
18_sky.jpg
18_sky_blue.jpg
boy1.jpg
boy2.jpg
“行了,你跟Windows比比,看看是不是一样的”,李四说完起身回了自己工位。
周五仔细对比了一会儿,确实一模一样,一点毛病都没有。随后佩服的走到李四工位前,“四哥,你真是我亲哥,一会儿下班咱们走起!”
Comparator<String> naturalOrderComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int index1 = 0, index2 = 0;
while (index1 < s1.length() && index2 < s2.length()) {
char c1 = s1.charAt(index1);
char c2 = s2.charAt(index2);
if (Character.isDigit(c1) && Character.isDigit(c2)) {
int num1 = 0, num2 = 0;
while (index1 < s1.length() && Character.isDigit(s1.charAt(index1))) {
num1 = num1 * 10 + s1.charAt(index1++) - '0';
}
while (index2 < s2.length() && Character.isDigit(s2.charAt(index2))) {
num2 = num2 * 10 + s2.charAt(index2++) - '0';
}
if (num1!= num2) {
return Integer.compare(num1, num2);
}
} else {
if (c1!= c2) {
return c1 - c2;
}
index1++;
index2++;
}
}
return s1.length() - s2.length();
}
};
周五将李四的代码总结好,找王哥review了代码push到仓库,网站的展示页面就生效了。
晚上周五请李四吃了顿大餐。后来周五发现,不止Windows系统,在日常用的Linux系统中文件夹中文件名的排序也是这样的顺序。