我有一个MCommand对象的ArrayList(cmdList),我想对它进行排序,以便在ArrayList中具有最近点的形状彼此相邻。例如,假设我在ArrayList中有三行: line(xs,ys,zs,xe,ye,ze)
cmdList [0] = line1(1.3,2.5,3,4,5,6)
cmdList [1] =第2行(1,5,6,7,7,7,2,2)
cmdList [2] = line3(1,6,3,1,1.1,1)
需要关闭的点是与其他行的BeginPosition一致的LastPosition行。 行的LastPosition是(xe,ye,ze),行的BeginPosition是(xs,ys,zs)。 我现在通过执行内置排序来进行排序:
cmdList.Sort(new MCommandComparer());
这就是我的MCommand的样子,以及我如何计算两点的距离:
public abstract class MCommand
{
//...
public abstract Point3 LastPosition { get; }
public abstract Point3 BeginPosition { get; }
public double CompareTo(Object obj)
{
Point3 p1, p2;
p1 = this.BeginPosition;
p2 = ((MCommand)obj).LastPosition;
return Math.Sqrt(Math.Pow((p2.x - p1.x), 2) +
Math.Pow((p2.y - p1.y), 2) +
Math.Pow((p2.z - p1.z), 2));
}
}
这是我使用的比较器:
public class MCommandComparer : IComparer
{
private MCommand prev;
double distanceFromPrev = 0;
double distanceFromCurr = 0;
public int Compare(object o1, object o2)
{
if ((MCommand)o2 == prev)
return 0;
if (prev != null)
distanceFromPrev = ((MCommand)o1).CompareTo(prev);
distanceFromCurr = ((MCommand)o1).CompareTo(o2);
prev = (MCommand)o2;
return (int)(distanceFromCurr - distanceFromPrev);
}
}
我尝试了很多方法并且迷路了...这并没有按照我想要的方式排序。我的问题是,我可能做错了什么?我应该尝试从头开始编写排序吗?我的ArrayList可以包含几千个元素,我需要有效的排序。
答案 0 :(得分:1)
我可能做错了什么?
您假设元素将以特定顺序呈现给您 - 您正在记住“前一个”元素,这是一个巨大的红旗。
各种各样的工作方式根本不会这样做。基本上你的比较器应该是无状态的。听起来你在这里没有真正的总排序 - 没有办法取任何两个任意元素,并说明哪一个应该在另一个之前或之后。
我不知道你究竟是怎么做的,但我不认为.NET中内置的标准排序会对你有所帮助。
答案 1 :(得分:0)
您可以让您的MCommand类订阅IComparable。在执行此操作时,您将允许列表对形状进行排序,而无需其他Comparer Object。所有排序功能都将由列表及其中的对象处理。