0

我有一个 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 可以包含数千个元素,我需要进行有效的排序。

4

2 回答 2

1

我可能做错了什么?

您假设元素将以特定顺序呈现给您 - 您正在记住“前一个”元素,这是一个巨大的危险信号。

各种工作方式根本不会这样做。基本上你的比较器应该是无国籍的。听起来您在这里并没有真正的完整顺序-无法获取任意两个元素并说出哪个应该在另一个之前或之后。

我不确切知道您将如何做您需要的任何事情,但我认为.NET 中内置的标准排序不会对您有太大帮助。

于 2010-07-08T14:17:30.553 回答
0

你可以让你的 MCommand 类订阅 IComparable。在这样做时,您将允许您的列表对您的形状进行排序,而无需额外的比较器对象。所有排序功能都将由列表和其中的对象处理。

于 2010-07-08T14:27:34.790 回答