zoukankan      html  css  js  c++  java
  • c#按字符串中的数字排序问题

     在.net 的framewrok框架中提供的排序方法中,如string.sort() 或ArrayList.Sort()方法。这两个方法对字符串排序时,如果字符串中含有数字,则不会按数字大小排序。如:

    如下有四个字符串,
     ArrayList list = new ArrayList(4);
     List.Add(“aa1”);
    List.Add(“aa100);
     List.Add(“aa10);
     List.Add(“aa2”);
     List.Sort();
     
    我们原意希望排序后的顺序为:
     aa1,aa2,aa10,aa100
     
    可是上面的代码执行后的排序顺序为
     aa1,aa10,aa100,aa2
     
    为了序排序后的效果为我们想要的按字符串中的数值排序,我们必须重写字符串的比较函数。
    代码思路:
    由于比较两个字符串时,是逐个比较字符,先从第一个字符开始比较,取出两个字符串中的第一个字符比较,如果比较结果是大于,则说明第一个字符串大于第二个字符串,如果小于,则说明第一个字符串小于第二字符串,如果等于,则比较两个字符串中的第二个字符。如果比到最后也是相等,则说明两个字符串一样大,如果有一个字符串要多一些字符,则这个字符串在大一些。
    我们改进这个算法:在比较过程中如果发现数字,则先不进行比较,看下一个字符是否为数字,这个取出两个字符串中的数字,按数字的数值大小来进行比较。如果相等再取一个字符进行比较。
     
    如下我的代码:(注:对于上面的例子,由于我们可以利用sort()函数的另一重载方法。Sort (
            IComparer comparer
    ))
    故我们只需要写一个继承自Icomparer接口的比较类,即可。
        ///<summary>
        ///主要用于文件名的比较。
        ///</summary>
        public class FilesNameComparerClass : IComparer
        {
           // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
           ///<summary>
           ///比较两个字符串,如果含用数字,则数字按数字的大小来比较。
           ///</summary>
           ///<param name="x"></param>
           ///<param name="y"></param>
           ///<returns></returns>
           int IComparer.Compare( Object x, Object y )
           {
               if(x==null||y==null)
                  throw new ArgumentException("Parameters can't be null");
               string fileA = x as string;
               string fileB = y as string;
               char[] arr1   =   fileA.ToCharArray();
               char[] arr2 = fileB.ToCharArray();
               int i = 0, j =0;
               while( i < arr1.Length && j < arr2.Length)
               {
                  if ( char.IsDigit( arr1[i]) && char.IsDigit( arr2[j] ) )
                  {
                      string s1 = "",s2 = "";
                      while ( i < arr1.Length && char.IsDigit( arr1[i]) )
                      {
                         s1 += arr1[i];
                         i++;
                      }
                      while (j < arr2.Length && char.IsDigit( arr2[j] ))
                      {
                         s2 += arr2[j];
                         j++;
                      }
                      if ( int.Parse( s1 ) > int.Parse( s2) )
                      {
                         return 1;
                      }
                      if ( int.Parse( s1 ) < int.Parse( s2) )
                      {
                         return -1;
                      }
                  }
                  else
                  {
                      if ( arr1[i] > arr2[j] )
                      {
                         return 1;
                      }
                      if ( arr1[i] < arr2[j] )
                      {
                         return -1;
                      }
                      i++;
                      j++;
                  }
               }
               if ( arr1.Length == arr2.Length )
               {
                  return 0;
               }
               else
               {
                  return arr1.Length > arr2.Length? 1: -1;
               }
               //            return string.Compare( fileA, fileB );
               //            return( (new CaseInsensitiveComparer()).Compare( y, x ) );
           }
        }
     调用时的代码如下:
    IComparer fileNameComparer = new FilesNameComparerClass();
    List.Sort( fileNameComparer );
    这样排序后的字符串就为按字符串中的数值排序了,为:
    aa1,aa2,aa10,aa100
  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/linyechengwei/p/3224200.html
Copyright © 2011-2022 走看看