Warm tip: This article is reproduced from serverfault.com, please click

其他-在Java中对包含数字的字符串进行排序

(其他 - Sorting Strings that contains number in Java)

发布于 2012-12-20 13:43:19

我有默认的字符串比较器(在SortedSet中)有问题。问题是默认比较器无法对包含数字的好的字符串进行排序,即:在集合中,我具有:

room1, room2, room100

自然排序应该像上面一样,但是在集合中我有:

room1, room100, room2

我知道为什么会这样,但是我不知道如何更改它。

Questioner
MAGx2
Viewed
11
2020-07-08 15:30:22

尝试使用此比较器,该比较器将删除所有非数字字符,然后将其余字符与数字进行比较:

Collections.sort(strings, new Comparator<String>() {
    public int compare(String o1, String o2) {
        return extractInt(o1) - extractInt(o2);
    }

    int extractInt(String s) {
        String num = s.replaceAll("\\D", "");
        // return 0 if no digits found
        return num.isEmpty() ? 0 : Integer.parseInt(num);
    }
});

这是一个测试:

public static void main(String[] args) throws IOException {
    List<String> strings = Arrays.asList("room1.2", "foo1.1", "foo", "room2.3", "room100.999", "room10", "room.3");

    Collections.sort(strings, new Comparator<String>() {
        public int compare(String o1, String o2) {
            return extractInt(o1) - extractInt(o2);
        }

        int extractInt(String s) {
            String num = s.replaceAll("\\D", "");
            // return 0 if no digits found
            return num.isEmpty() ? 0 : Integer.parseInt(num);
        }
    });
    System.out.println(strings);
}

输出:

[foo, room1, room2, room10, room100]

当数字为小数时(也表示Java 8+样式):

public static void main(String[] args) {
    List<String> strings = Arrays.asList("room1.2", "foo1.1", "room2.3", "room100.999", "room10", "room.3");
    Collections.sort(strings, Comparator.comparing(Application::extractDouble));
    System.out.println(strings);
}

static double extractDouble(String s) {
    String num = s.replaceAll("[^\\d.]", "");
    // return 0 if no digits found
    return num.isEmpty() ? 0 : Double.parseDouble(num);
}

结果:

[foo, room.3, foo1.1, room1.2, room2.3, room10, room100.999]