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++; } } }
关键说明
- 自定义比较器:
- 先去除文件名的扩展名(比如
.png),防止扩展名干扰数字提取和转换。 - 将文件名转换为整数后按数值大小比较;如果文件名不是纯数字,则回退到默认的字典序排序。
- 先去除文件名的扩展名(比如
- 循环边界修复:原代码
numFrames <= frames会导致访问超出数组索引范围的元素,改成numFrames < frames即可避免数组越界。 - 保留扩展名:新增提取原文件扩展名的逻辑,重命名后不会丢失文件格式(比如图片文件重命名后仍为图片格式)。
内容的提问来源于stack exchange,提问作者Chris Irimia
相关产品推荐
相关产品推荐

