c#按字符串中的数字排序问题
在 的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
为了序排序后的效果为我们想要的按字符串中的数值排序,我们必须重写字符串的⽐较函数。
代码思路:
由于⽐较两个字符串时,是逐个⽐较字符,先从第⼀个字符开始⽐较,取出两个字符串中的第⼀个字符⽐较,如果⽐较结果是⼤于,则说明第⼀个字符串⼤于第⼆个字符串,如果⼩于,则说明第⼀个字符串⼩于第⼆字符串,如果等于,则⽐较两个字符串中的第⼆个字符。如果⽐到最后也是相等,则说明两个字符串⼀样⼤,如果有⼀个字符串要多⼀些字符,则这个字符串在⼤⼀些。字符串长度排序c语言
我们改进这个算法:在⽐较过程中如果发现数字,则先不进⾏⽐较,看下⼀个字符是否为数字,这个取出两个字符串中的数字,按数字的数值⼤⼩来进⾏⽐较。如果相等再取⼀个字符进⾏⽐较。
如下我的代码:(注:对于上⾯的例⼦,由于我们可以利⽤sort()函数的另⼀重载⽅法。Sort (
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) )
{
return1;
}
if ( int.Parse( s1 ) < int.Parse( s2) )
{
return -1;
}
}
else
{
if ( arr1[i] > arr2[j] )
{
return1;
}
if ( arr1[i] < arr2[j] )
{
return -1;
}
i++;
j++;
}
}
if ( arr1.Length == arr2.Length )
{
return0;
}
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论