Java字符串数字比较器

Jas*_*son 8 java natural-sort

我有一个方法返回需要排序的String列表.但是,我遇到了旧的字符串编号排序问题,并想知道是否有人可以协助比较器实现或指向我的方向.

该列表将返回一个列表:

State Lower Legislative District 1
State Lower Legislative District 11
State Lower Legislative District 12
...
State Lower Legislative District 2
...
State Lower Legislative District 100
...
State Upper Legislative District 1
State Upper Legislative District 11
...
Run Code Online (Sandbox Code Playgroud)

所以,首先我需要做一个基本的String排序,但是我需要按数字排序.要排序的数字应该总是跟踪,可能是2或3位数.

(编辑)我最初的想法是在空格上拆分字符串,在数字部分运行StringUtils.isNumeric,然后排序.然而,这对我来说似乎有点困难.

有人可以帮忙吗?

Joh*_*ica 6

一篇关于 Coding Horror 的文章.这称为自然排序,您可以将一组数字有效地视为单个"字符".对于该想法的一些Java实现,请参阅此问题.

人类排序:自然排序

几乎每种编程语言中的默认排序功能都不适合人类消费.那是什么意思?好吧,考虑在Windows资源管理器中排序文件名,并通过Array.Sort()代码对这些文件名进行排序之间的区别:

Windows资源管理器 中的Array.sort()

继续...


Jur*_*rff 6

我在 String.CompareTo 上写了一个变体,它比较了在两个字符串中找到的数字的长度。当遇到两个相同长度的数字时,字母数字比较恢复正常。它还跳过前导零。

public static int compareNatural(String a, String b) {
    int la = a.length();
    int lb = b.length();
    int ka = 0;
    int kb = 0;
    while (true) {
        if (ka == la)
            return kb == lb ? 0 : -1;
        if (kb == lb)
            return 1;
        if (a.charAt(ka) >= '0' && a.charAt(ka) <= '9' && b.charAt(kb) >= '0' && b.charAt(kb) <= '9') {
            int na = 0;
            int nb = 0;
            while (ka < la && a.charAt(ka) == '0')
                ka++;
            while (ka + na < la && a.charAt(ka + na) >= '0' && a.charAt(ka + na) <= '9')
                na++;
            while (kb < lb && b.charAt(kb) == '0')
                kb++;
            while (kb + nb < lb && b.charAt(kb + nb) >= '0' && b.charAt(kb + nb) <= '9')
                nb++;
            if (na > nb)
                return 1;
            if (nb > na)
                return -1;
            if (ka == la)
                return kb == lb ? 0 : -1;
            if (kb == lb)
                return 1;

        }
        if (a.charAt(ka) != b.charAt(kb))
            return a.charAt(ka) - b.charAt(kb);
        ka++;
        kb++;
    }
}
Run Code Online (Sandbox Code Playgroud)