Sort on a string that may contain a number

前端 未结 23 2455
走了就别回头了
走了就别回头了 2020-11-22 02:59

I need to write a Java Comparator class that compares Strings, however with one twist. If the two strings it is comparing are the same at the beginning and end of the strin

23条回答
  •  情书的邮戳
    2020-11-22 03:53

    The implementation I propose here is simple and efficient. It does not allocate any extra memory, directly or indirectly by using regular expressions or methods such as substring(), split(), toCharArray(), etc.

    This implementation first goes across both strings to search for the first characters that are different, at maximal speed, without doing any special processing during this. Specific number comparison is triggered only when these characters are both digits. A side-effect of this implementation is that a digit is considered as greater than other letters, contrarily to default lexicographic order.

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

提交回复
热议问题