zhongrj
2024-02-22 4ed8e5eee778357cc30d938d6d9ae4ecf7b2a312
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package org.springblade.common.utils;
 
import org.apache.logging.log4j.util.Strings;
 
public class ComplexNumberStringComparator{
 
    public static int compare(String s1, String s2) {
        int i1 = 0, i2 = 0;
        while (i1 < s1.length() && i2 < s2.length()) {
            char c1 = s1.charAt(i1);
            char c2 = s1.charAt(i2);
            if (Character.isDigit(c1) && Character.isDigit(c2)) {
                //比较数字大小
                int num1 = getNumber(s1, i1);
                int num2 = getNumber(s2, i2);
                if (num1 != num2) {
                    return Integer.compare(num1, num2);
                }
                //相同数字时继续比较下一位
                i1 += Integer.toString(num1).length();
                i2 += Integer.toString(num2).length();
            } else {
                //普通字符按照字典排序
                if (c1 != c2) {
                    return Character.compare(c1, c2);
                }
                i1++;
                i2++;
            }
        }
        //如果前缀相同,则长度短的字符串排在前面
        return Integer.compare(s1.length(), s2.length());
    }
 
    private static int getNumber(String s, int start) {
        int end = start;
        while (end < s.length() && Character.isDigit(s.charAt(end))) {
            end++;
        }
        if (start==end){
            return 0;
        }
        return Integer.parseInt(s.substring(start, end));
    }
 
}