package com.point.strategy.common; import java.io.File; import java.util.Comparator; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileNameComparator implements Comparator { private static final Pattern NUMBER_PATTERN = Pattern.compile("(\\d+)"); @Override public int compare(String s1, String s2) { String name1 = new File(s1).getName(); String name2 = new File(s2).getName(); Matcher m1 = NUMBER_PATTERN.matcher(name1); Matcher m2 = NUMBER_PATTERN.matcher(name2); int pos1 = 0, pos2 = 0; while (m1.find() && m2.find()) { // 比较数字前的字符串部分 String prefix1 = name1.substring(pos1, m1.start()); String prefix2 = name2.substring(pos2, m2.start()); int prefixCompare = prefix1.compareTo(prefix2); if (prefixCompare != 0) { return prefixCompare; } // 比较数字部分(按数值比较) Long num1 = Long.parseLong(m1.group()); Long num2 = Long.parseLong(m2.group()); int numCompare = num1.compareTo(num2); if (numCompare != 0) { return numCompare; } pos1 = m1.end(); pos2 = m2.end(); } // 比较剩余部分 String suffix1 = name1.substring(pos1); String suffix2 = name2.substring(pos2); return suffix1.compareTo(suffix2); } }