其实一开始看到double[][]我是很懵圈的,这是个什么玩意儿。不过我试着一步一步用语言去解释它的时候,可以这样理解,用于存放数组的数组。
也就是说,在这个数组中double[0][]的一个元素也是数组。不过闲话不扯了,那么回到问题上来,该怎么排序呢?
假设有如下几个点(1,4), (5,8), (4,2), (7,9), (10,11).我们现在是需要根据Y轴来进行一个排序。
OK,我们先在程序里面,把这个东西抽象出来。如下所示。
var points = new double[][] {
new double[]{ 1,4 },
new double[]{ 5,8 },
new double[]{ 4,2 },
new double[]{ 7,9 },
new double[]{ 10,11 }
};
其实显而易见,在这里我们约定point[0][0]代表点的X坐标,point[0][1]代表点的Y坐标。我们需要看到的结果,是如图所示的。
但是在这个情况中,如果像针对一维数组那样,直接采用各种排序方法不大适用。
OK,那我能不能想到一个办法,没错,就是投票。
首先取出第一个点的Y坐标,然后和其他的几个点分别和第一个点比对,如果小于第一个点的Y坐标则记一分。
那继续取出第二个点的Y坐标,剩余几个又分别和它比对,如果小于第二个点,又分别记一分。
直到最后....分数最多的那个,肯定是最小的.....谈到这里,是不是好像两个for循环就在面前飞了。
下面就是代码....
public static double[][] Sort(double[][] points,int index)
{
var result = new double[points.Length][];//用来返回排序后结果的
var sort = new List<int>(); //用来负责收集积分的,哈哈,谁分多,谁最小
for (int i = 0; i < points.Length; i++) //初始所有积分为0
{
sort.Add(0);
}
//在这里排序了,算积分
for (int i = 0; i < points.Length ; i++)
{
for (int j = 0; j < points.Length ; j++)
{
if (i != j && points[j][index] > points[i][index])//因为和自己比对是没用的,所以i肯定不能等于j
{
sort[i] += 1;
}
}
}
//根据积分然后来重新构造个结果集
for (int i = 0; i < result.Length; i++)
{
result[result.Length - i -1] = points[sort.FindIndex(m => m == i)];
}
return result;
}
不信邪的可以试试,index是取的1,如上述所说。
但是这里问题来了,坐标点都不一样,那么如果遇到一样的呢?排名会不会出问题。当然,不信的可以自己试试。
在此我就不提会发生什么问题了。那么我们再约定嘛,如果遇到点的Y坐标相同,那么先出来的那个点算是大的,后面那个点是小的。(当然,怎么约定看个人心情和想法)
那么代码如下了。
public static double[][] Sort(double[][] points,int index)
{
var result = new double[points.Length][];
var sort = new List<int>();
for (int i = 0; i < points.Length; i++)
{
sort.Add(0);
}
for (int i = 0; i < points.Length ; i++)
{
for (int j = 0; j < points.Length ; j++)
{
if (i != j && points[j][index] >= points[i][index])
{
if (points[j][index] != points[i][index])
{
sort[i] += 1;
}
else if (points[j][index] == points[i][index] && i < j)
{
sort[i] += 1;
}
}
}
}
for (int i = 0; i < result.Length; i++)
{
result[result.Length - i -1] = points[sort.FindIndex(m => m == i)];
}
return result;
}
Bingo....运行结果,如上图结果所示.....
这样我们自己想办法实现了排序,不过刚才我的朋友给了我一个方法....
points=points.OrderBy(a => a[1]).ToArray();
好像一句就解决了.....不过自己实现嘛,好歹也是有意义和价值的。综上,提供了两种方法。
未经许可,请勿转载哦。亲。