You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中带末尾数字的文件名数组无法按数值排序怎么解决?

解决文件名按数值顺序排序的问题

你遇到的问题是因为Arrays.sort()默认采用字典序排序,所以会出现1,10,100...的顺序,而不是你想要的数值顺序。要实现按文件名里的数字大小排序,需要自定义排序规则。

修改方案

核心是给Arrays.sort()传入一个自定义的比较器,提取文件名中的数字部分并转换成整数进行比较。同时还要修复原代码里的循环边界问题(避免数组越界)。

修改后的完整代码

import java.util.Scanner;
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;

public class OsuSkinFramerDriver {

    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);

        int numFrames = 0;
        int frames;
        String assetType;

        System.out.println();
        System.out.println("What kind of asset is this (example: menu-back) (Please make sure you add any special characters(dashes) or else it wont work");
        assetType = keyboard.nextLine();
        System.out.println();
        System.out.println("Make sure you have all of the images you want to rename in a folder. When you do, input anything");
        keyboard.nextLine();

        File directory = new File("C:\\Users\\chris\\IdeaProjects\\Osu Skin framer\\src\\TEst");
        frames = directory.list().length;
        System.out.println();
        System.out.println("File Count:" + frames);

        String contents[] = directory.list();

        // 自定义排序:按文件名中的数字数值排序
        Arrays.sort(contents, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 先去掉文件名的扩展名(比如.png),避免影响数字提取
                String fileName1 = s1.contains(".") ? s1.substring(0, s1.lastIndexOf('.')) : s1;
                String fileName2 = s2.contains(".") ? s2.substring(0, s2.lastIndexOf('.')) : s2;
                
                try {
                    // 把文件名转成整数,按数值比较
                    int num1 = Integer.parseInt(fileName1);
                    int num2 = Integer.parseInt(fileName2);
                    return Integer.compare(num1, num2);
                } catch (NumberFormatException e) {
                    // 如果文件名不是纯数字, fallback到默认的字典序
                    return s1.compareTo(s2);
                }
            }
        });

        for(int i=0; i < contents.length; i++) {
            System.out.println(contents[i]);
        }

        // 修复循环边界:numFrames < frames,避免数组越界
        while(numFrames < frames){
            File image = new File("C:\\Users\\chris\\IdeaProjects\\Osu Skin framer\\src\\TEst\\" + contents[numFrames]);
            // 保留原文件的扩展名,避免丢失文件格式
            String ext = "";
            if (contents[numFrames].contains(".")) {
                ext = contents[numFrames].substring(contents[numFrames].lastIndexOf('.'));
            }
            File rename = new File("C:\\Users\\chris\\IdeaProjects\\Osu Skin framer\\src\\TEst\\" + assetType + "-" + numFrames + ext);

            image.renameTo(rename);

            numFrames++;
        }
    }
}

关键说明

  1. 自定义比较器:
    • 先去除文件名的扩展名(比如.png),防止扩展名干扰数字提取和转换。
    • 将文件名转换为整数后按数值大小比较;如果文件名不是纯数字,则回退到默认的字典序排序。
  2. 循环边界修复:原代码numFrames <= frames会导致访问超出数组索引范围的元素,改成numFrames < frames即可避免数组越界。
  3. 保留扩展名:新增提取原文件扩展名的逻辑,重命名后不会丢失文件格式(比如图片文件重命名后仍为图片格式)。

内容的提问来源于stack exchange,提问作者Chris Irimia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:08:28