程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> c#按字符串中的數字排序問題

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

編輯:關於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接口的比較類,即可。
code///
///主要用於文件名的比較。
///
public class FilesNameComparerClass : IComparer
{

// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
///
///比較兩個字符串,如果含用數字,則數字按數字的大小來比較。
///
///
///
///
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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved