• [转载]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

    本文出自 齐码代码,转载时请注明出处及相应链接。

    本文永久链接: http://www.7mdm.com/172.html

  • 相关阅读:
    SQL-----DML
    C#常见笔试题
    事务
    HTM5制作的闹钟
    InforPath获取当前用户
    邮件中的样式问题
    InforPath的几个基础性的东西
    代码读取InforPath内容并进行修改
    python操作mysql(4)--增删改查
    python操作mysql(3)--链接数据库
  • 原文地址:https://www.cnblogs.com/xkis/p/3307418.html
Copyright © 2020-2023  润新知