heheng
6 天以前 427f9796bf60fe1262131a8fd6ae6c25e02574be
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 com.gkhy.exam.common.utils;
 
import java.util.Comparator;
 
public class NaturalOrderComparator  implements Comparator<String> {
    private boolean isDigit(char ch) {
        return ch >= '0' && ch <= '9';
    }
 
    @Override
    public int compare(String s1, String s2) {
        if (s1 == null || s2 == null) {
            return 0; // 或根据业务决定 null 的排序位置
        }
 
        int i1 = 0, i2 = 0;
        while (i1 < s1.length() && i2 < s2.length()) {
            char c1 = s1.charAt(i1);
            char c2 = s2.charAt(i2);
 
            if (isDigit(c1) && isDigit(c2)) {
                // 比较数字部分
                long n1 = 0, n2 = 0;
                while (i1 < s1.length() && isDigit(s1.charAt(i1))) {
                    n1 = n1 * 10 + (s1.charAt(i1++) - '0');
                }
                while (i2 < s2.length() && isDigit(s2.charAt(i2))) {
                    n2 = n2 * 10 + (s2.charAt(i2++) - '0');
                }
                if (n1 != n2) {
                    return Long.compare(n1, n2);
                }
            } else {
                // 非数字字符比较
                if (c1 != c2) {
                    return Character.compare(c1, c2);
                }
                i1++;
                i2++;
            }
        }
 
        // 剩余长度比较
        return Integer.compare(s1.length(), s2.length());
    }
}