- 此问题已在此处有答案**:
Sort on a string that may contain a number(25个回答)
6年前关闭。
我有问题与字符串的默认比较器(在SortedSet)。问题是,默认的比较器不会对包含数字的字符串进行排序,即:在集合中,我有:
room1, room2, room100
自然排序应该像上面一样,但在设置中我有:
room1, room100, room2
我知道为什么,但我不知道如何改变它。
Sort on a string that may contain a number(25个回答)
6年前关闭。
我有问题与字符串的默认比较器(在SortedSet)。问题是,默认的比较器不会对包含数字的字符串进行排序,即:在集合中,我有:
room1, room2, room100
自然排序应该像上面一样,但在设置中我有:
room1, room100, room2
我知道为什么,但我不知道如何改变它。
6条答案
按热度按时间c9qzyr3d1#
试试这个比较器,它删除所有非数字字符,然后将剩余的字符作为数字进行比较:
当代码为run时:
这是输出:
当数字是小数时,保留数字 * 和 * 点。
当这段代码(显示使用函数而不是匿名类)是run时:
这是输出:
wsewodh22#
使用@bohemian回答。只是进步了一点。这对我很有效。
lkaoscv73#
试试这个。我假设你总是在字符串的开头有“空间”。
dgsult0t4#
下面是我的
Comparator
实现:(字符串可以从任何字符开始)bihw5rsg5#
您可以实现一个比较器并将其传递给set构造函数。参见http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html。
如果你所有的字符串都是room[number]的形式,你可以去掉“room”,解析这个数字,然后用它来比较。
或者-您可以存储整数在您的设置和打印他们与“房间”前缀。
uklbhaso6#
一个懒惰的替代方案是让String比较器工作,而不做任何额外的事情(定义自己的比较器)。你可以通过在字符串中填充零来实现这一点,就像这样:
room0001, room0002, room0100
则默认的String比较器将工作。但是,您需要知道最大数值,以便相应地调整填充。