我有一个数组。我的数组中的每个空间都包含两个字符串(一个字符串只包含字母,另一个包含数字)。
我现在要做的是按字母顺序或数字顺序对数组进行排序(取决于选择数组中的哪个空间)。为此,我使用 compareTo() 方法。但是,我发现当我尝试根据数字对数组进行排序时,它实际上并没有真正起作用。
我的猜测是,由于 Java 使用 ascii 代码处理字符串,因此数字不会按数字顺序显示。
问题:我该如何解决?
对于比较数字,这可能会有所帮助。
字母算法
来自网站:http ://www.davekoelle.com/alphanum.html
人们对带有数字的字符串进行排序与软件不同。大多数排序算法比较 ASCII 值,这会产生与人类逻辑不一致的排序。这是修复它的方法。
这是来自该站点的 Java 比较器实现的链接。 http://www.davekoelle.com/files/AlphanumComparator.java
在您的compareTo()
方法中,当您检测到您正在查看表示整数的两个字符串时,请确保它们的长度相同,然后再进行比较。如果一个字符串较短,则在其前面添加前导零,直到字符串长度相等。
例如,32
and123
用于与默认算法不正确比较:3
更大,因此32
比较为 after 132
。但是,一旦您在前面加上零,比较就会再次起作用:032
小于123
.
是的,你是对的,字符串是根据它们的 Unicode 代码点值排序的。这意味着“2”小于“a”且大于“11”。
我怀疑您正在寻找Natural Sort Order。Java String Number Comparator是一篇很棒的 SO 帖子,详细介绍了它,您可以在 SO 帖子中找到实际实现Java 中的自然排序顺序字符串比较 - 是内置的吗?
您可以使用 Long(or)Folat.isNaN() 方法来检查其编号或刺痛,然后使用该方法进行排序。
在对字符串进行数字排序之前,先将它们转换为数字。