Java中包含数字的字符串[重复]

euoag5mw  于 2023-06-28  发布在  Java
关注(0)|答案(6)|浏览(112)
    • 此问题已在此处有答案**:

Sort on a string that may contain a number(25个回答)
6年前关闭。
我有问题与字符串的默认比较器(在SortedSet)。问题是,默认的比较器不会对包含数字的字符串进行排序,即:在集合中,我有:

room1, room2, room100

自然排序应该像上面一样,但在设置中我有:

room1, room100, room2

我知道为什么,但我不知道如何改变它。

c9qzyr3d

c9qzyr3d1#

试试这个比较器,它删除所有非数字字符,然后将剩余的字符作为数字进行比较:

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);
    }
});

当代码为run时:

public static void main(String[] args) {
    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, room.3, room10, foo1.1, room1.2, room2.3, room100.999]

当数字是小数时,保留数字 * 和 * 点。
当这段代码(显示使用函数而不是匿名类)是run时:

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);
}

这是输出:

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

wsewodh22#

使用@bohemian回答。只是进步了一点。这对我很有效。

Collections.sort(asdf, new Comparator<String>() {
            public int compare(String o1, String o2) {

                String o1StringPart = o1.replaceAll("\\d", "");
                String o2StringPart = o2.replaceAll("\\d", "");

                if(o1StringPart.equalsIgnoreCase(o2StringPart))
                {
                    return extractInt(o1) - extractInt(o2);
                }
                return o1.compareTo(o2);
            }

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

lkaoscv73#

试试这个。我假设你总是在字符串的开头有“空间”。

List<String> list = Arrays.asList("room1", "room100", "room2");
    Collections.sort(list, new Comparator<String>()
    {
        @Override
        public int compare(String o1, String o2)
        {
            return new Integer(o1.replaceAll("room", ""))
                .compareTo(new Integer(o2.replaceAll("room", "")));
        }

    });
dgsult0t

dgsult0t4#

下面是我的Comparator实现:(字符串可以从任何字符开始)

public class StringNumberComparator implements Comparator<String>{

    @Override
    public int compare(String o1, String o2) {
    int i1 = this.getRearInt(o1);
    int i2 = getLeadingInt(o2);
    String s1 = getTrailingString(o1);
    String s2 = getTrailingString(o2);

    if(i1==i2)
         return s1.compareTo(s2);
    if(i1>i2)
         return 1;
    else if(i1<i2)
            return -1;
    return 0;
    }

    private int getRearInt(String s) {
    s=s.trim();
    int i=Integer.MAX_VALUE;
    try {
             i = Integer.parseInt(s.split("[^0-9]+")[1]);
    } catch(ArrayIndexOutOfBoundsException e) {

    } catch(NumberFormatException f) {
            return i;
    }

    return i;
    }

    private String getTrailingString(String s) {
        return  s.replaceFirst("[0-9]", "");
    }
}
bihw5rsg

bihw5rsg5#

您可以实现一个比较器并将其传递给set构造函数。参见http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html
如果你所有的字符串都是room[number]的形式,你可以去掉“room”,解析这个数字,然后用它来比较。
或者-您可以存储整数在您的设置和打印他们与“房间”前缀。

uklbhaso

uklbhaso6#

一个懒惰的替代方案是让String比较器工作,而不做任何额外的事情(定义自己的比较器)。你可以通过在字符串中填充零来实现这一点,就像这样:room0001, room0002, room0100则默认的String比较器将工作。但是,您需要知道最大数值,以便相应地调整填充。

相关问题