对可能包含数字的字符串进行排序

对可能包含数字的字符串进行排序

我需要编写一个Java Comparator类来比较Strings,但是有一个转折。如果它比较的两个字符串在字符串的开头和结尾是相同的,并且不同的中间部分是整数,则根据这些整数的数值进行比较。例如,我希望以下字符串以它们显示的顺序结束:

  • AAA

  • bbb 3 ccc

  • bbb 12 ccc

  • ccc 11

  • DDD

  • eee 3 ddd jpeg2000 eee

  • eee 12 ddd jpeg2000 eee

如您所见,字符串中可能还有其他整数,因此我不能只使用正则表达式来分解任何整数。我正在考虑从一开始就走绳子,直到找到一点不匹配,然后走到最后,直到找到一个不匹配的位,然后比较中间的位到正则表达式“[0-9] +”,如果比较,则进行数值比较,否则进行词法比较。

有没有更好的办法?

更新我不认为我可以保证字符串中的其他数字,可能匹配的数字,周围没有空格,或者不同的数字确实有空格。


德玛西亚99
浏览 985回答 3
3回答

蝴蝶刀刀

Alphanum算法来自网站“人们对数字字符串的排序与软件不同。大多数排序算法都会比较ASCII值,这会产生与人类逻辑不一致的排序。以下是如何修复它。”编辑:这是从该站点到Java Comparator实现的链接。

扬帆大鱼

我在这里提出的实现简单而有效。它不会通过使用正则表达式或方法(如substring(),split(),toCharArray()等)直接或间接分配任何额外的内存。此实现首先跨越两个字符串,以最大速度搜索不同的第一个字符,而不执行任何特殊处理。仅当这些字符都是数字时才触发特定数字比较。这种实现的副作用是数字被认为比其他字母大,与默认的词典顺序相反。public&nbsp;static&nbsp;final&nbsp;int&nbsp;compareNatural&nbsp;(String&nbsp;s1,&nbsp;String&nbsp;s2){ &nbsp;&nbsp;&nbsp;//&nbsp;Skip&nbsp;all&nbsp;identical&nbsp;characters &nbsp;&nbsp;&nbsp;int&nbsp;len1&nbsp;=&nbsp;s1.length(); &nbsp;&nbsp;&nbsp;int&nbsp;len2&nbsp;=&nbsp;s2.length(); &nbsp;&nbsp;&nbsp;int&nbsp;i; &nbsp;&nbsp;&nbsp;char&nbsp;c1,&nbsp;c2; &nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0,&nbsp;c1&nbsp;=&nbsp;0,&nbsp;c2&nbsp;=&nbsp;0;&nbsp;(i&nbsp;<&nbsp;len1)&nbsp;&&&nbsp;(i&nbsp;<&nbsp;len2)&nbsp;&&&nbsp;(c1&nbsp;=&nbsp;s1.charAt(i))&nbsp;==&nbsp;(c2&nbsp;=&nbsp;s2.charAt(i));&nbsp;i++); &nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;end&nbsp;of&nbsp;string &nbsp;&nbsp;&nbsp;if&nbsp;(c1&nbsp;==&nbsp;c2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(len1&nbsp;-&nbsp;len2); &nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;digit&nbsp;in&nbsp;first&nbsp;string &nbsp;&nbsp;&nbsp;if&nbsp;(Character.isDigit(c1)) &nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;digit&nbsp;only&nbsp;in&nbsp;first&nbsp;string&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!Character.isDigit(c2)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Scan&nbsp;all&nbsp;integer&nbsp;digits &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x1,&nbsp;x2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(x1&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;(x1&nbsp;<&nbsp;len1)&nbsp;&&&nbsp;Character.isDigit(s1.charAt(x1));&nbsp;x1++); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(x2&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;(x2&nbsp;<&nbsp;len2)&nbsp;&&&nbsp;Character.isDigit(s2.charAt(x2));&nbsp;x2++); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Longer&nbsp;integer&nbsp;wins,&nbsp;first&nbsp;digit&nbsp;otherwise &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(x2&nbsp;==&nbsp;x1&nbsp;?&nbsp;c1&nbsp;-&nbsp;c2&nbsp;:&nbsp;x1&nbsp;-&nbsp;x2); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;digit&nbsp;only&nbsp;in&nbsp;second&nbsp;string &nbsp;&nbsp;&nbsp;if&nbsp;(Character.isDigit(c2)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1); &nbsp;&nbsp;&nbsp;//&nbsp;No&nbsp;digits &nbsp;&nbsp;&nbsp;return(c1&nbsp;-&nbsp;c2);}
打开App,查看更多内容
随时随地看视频慕课网APP