为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

对可能包含数字的字符串进行排序我需要编写一个Java Comparator类来比较Strings,但是有一个转折。如果它比较的两个字符串在字符串的开头和结尾是相同的,并且不同的中间部分是整数,则根据这些整数的数值进行比较。例如,我希望以下字符串以它们显示的顺序结束:AAAbbb 3 cccbbb 12 cccccc 11DDDeee 3 ddd jpeg2000 eeeeee 12 ddd jpeg2000 eee如您所见,字符串中可能还有其他整数,因此我不能只使用正则表达式来分解任何整数。我正在考虑从一开始就走绳子,直到找到一点不匹配,然后走到最后,直到找到一个不匹配的位,然后比较中间的位到正则表达式“[0-9] +”,如果比较,则进行数值比较,否则进行词法比较。有没有更好的办法?更新我不认为我可以保证字符串中的其他数字,可能匹配的数字,周围没有空格,或者不同的数字确实有空格。
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

Alphanum算法

来自网站

“人们对数字字符串的排序与软件不同。大多数排序算法都会比较ASCII值,这会产生与人类逻辑不一致的排序。以下是如何修复它。”

编辑:这是从该站点到Java Comparator实现的链接。


查看完整回答
反对 回复 2019-07-23
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

我在这里提出的实现简单而有效。它不会通过使用正则表达式或方法(如substring(),split(),toCharArray()等)直接或间接分配任何额外的内存。

此实现首先跨越两个字符串,以最大速度搜索不同的第一个字符,而不执行任何特殊处理。仅当这些字符都是数字时才触发特定数字比较。这种实现的副作用是数字被认为比其他字母大,与默认的词典顺序相反。

public static final int compareNatural (String s1, String s2){
   // Skip all identical characters
   int len1 = s1.length();
   int len2 = s2.length();
   int i;
   char c1, c2;
   for (i = 0, c1 = 0, c2 = 0; (i < len1) && (i < len2) && (c1 = s1.charAt(i)) == (c2 = s2.charAt(i)); i++);

   // Check end of string
   if (c1 == c2)
      return(len1 - len2);

   // Check digit in first string
   if (Character.isDigit(c1))
   {
      // Check digit only in first string 
      if (!Character.isDigit(c2))
         return(1);

      // Scan all integer digits
      int x1, x2;
      for (x1 = i + 1; (x1 < len1) && Character.isDigit(s1.charAt(x1)); x1++);
      for (x2 = i + 1; (x2 < len2) && Character.isDigit(s2.charAt(x2)); x2++);

      // Longer integer wins, first digit otherwise
      return(x2 == x1 ? c1 - c2 : x1 - x2);
   }

   // Check digit only in second string
   if (Character.isDigit(c2))
      return(-1);

   // No digits
   return(c1 - c2);}


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 940 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信