c#按字符串中的數字排序問題

 在.net 的framewrok框架中提供的排序方法中,如string.sort() 或ArrayList.Sort()方法。這兩個方法對字符串排序時,若是字符串中含有數字,則不會按數字大小排序。如:html

以下有四個字符串,
 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
相關文章
相關標籤/搜索