近日在用Array.Sort<string>方法对字符串数组进行排序时遇到了一个郁闷的问题。
Array.Sort<T>要求T应该事先IComparable<T>接口,而观察System.String类的定义,的确也实现了这个接口。看来不应该有什么问题。但请看下面的代码:
usingSystem;
namespaceConsoleApplication1
...{
classProgram
...{
staticvoidBubbleSort(string[]array)
...{
inti,j;//交换标志
stringtemp;
boolexchange;
for(i=0;i<array.Length;i++)//最多做R.Length-1趟排序
...{
exchange=false;//本趟排序开始前,交换标志应为假
for(j=array.Length-2;j>=i;j--)
...{
if(System.String.CompareOrdinal(array[j+1],array[j])<0) //交换条件
...{
temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
exchange=true;//发生了交换,故将交换标志置为真
}
}
if(!exchange)//本趟排序未发生交换,提前终止算法
...{
break;
}
}
}
staticvoidshowStrings(string[]ss)
...{
for(inti=0;i<ss.Length;i++)
Console.WriteLine(ss[i]);
}
staticvoidMain(string[]args)
...{
string[]ss1=
...{
"a=1",
"b=2",
"a_1=1",
"b_2=2",
"a_1_1=1",
"b_2_2=2",
"a_1=1_1",
"b_2=2_2"
};
string[]ss2=
...{
"a=1",
"b=2",
"a_1=1",
"b_2=2",
"a_1_1=1",
"b_2_2=2",
"a_1=1_1",
"b_2=2_2"
};
BubbleSort(ss1);
Console.WriteLine("UseBubbleSort:");
showStrings(ss1);
Array.Sort<string>(ss2);
Console.WriteLine("UseArray.Sort<string>:");
showStrings(ss2);
}
}
}
其中BubbleSort 是我自己写的一个简单的冒泡排序法。运行这段代码,得到的结果如下:
Use BubbleSort:
a=1
a_1=1
a_1=1_1
a_1_1=1
b=2
b_2=2
b_2=2_2
b_2_2=2
Use Array.Sort<string>:
a_1_1=1
a_1=1
a_1=1_1
a=1
b_2_2=2
b_2=2
b_2=2_2
b=2
Press any key to continue . . .
两种排序得到了截然不同的顺序。
观察起来,问题貌似出在“_”和“=”的比较上。
单独比较字符‘_’和‘=’,‘_’是大于‘=’的,也就是说,冒泡排序法排出来的顺序才是正确的。
难道是Array.Sort<T>有问题?期望高人帮忙解决。
本文探讨了使用 Array.Sort<string> 方法对字符串数组排序时遇到的问题,并通过自定义冒泡排序进行了对比,发现两种排序方式结果不一致,疑似与字符“_”和“=”的比较规则有关。
773

被折叠的 条评论
为什么被折叠?



