自学内容网 自学内容网

Windows系统文件夹中的文件名排序

一天张三、李四的同事周五接到王哥的一个任务需求,有一个文件夹,里面有许多图片文件,网页访问某个分类展示文件的时候,王哥希望文件名的展示顺序可以按照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系统中文件夹中文件名的排序也是这样的顺序。


原文地址:https://blog.csdn.net/ximen250/article/details/142414016

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!