我有一个 MCommand 对象 (cmdList) 的 ArrayList,我想对其进行排序,以便在 ArrayList 中具有最近点的形状彼此相邻。例如,假设我在 ArrayList 中有三行: line(xs, ys, zs, xe, ye, ze)
cmdList[0] = line1(1.3, 2.5, 3, 4, 5, 6)
cmdList[1] = line2(1, 5, 6.77, 7, 8, 2)
cmdList[2] = line3(1, 6, 3, 1, 1.1, 1)
需要靠近的点是线的 LastPosition 和其他线的 BeginPosition。直线的 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 可以包含数千个元素,我需要进行有效的排序。