0

MCommand オブジェクト (cmdList) の ArrayList があり、最も近い点を持つ形状が ArrayList 内で互いに隣り合うように並べ替えたいと考えています。たとえば、ArrayList に 3 つの行があるとします: 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 がどのように見えるか、および 2 点の距離を計算する方法です。

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

私は何が間違っているのでしょうか?

要素が特定の順序で表示されると想定しています。つまり、「前の」要素を覚えていることになります。これは非常に危険なフラグです。

さまざまな種類の作業方法では、これはまったく行われません。基本的に、比較子はステートレスである必要があります。ここでは完全な順序付けが実際にはないように思えます.2つの任意の要素を取り、どちらが他の要素の前または後にあるべきかを言う方法はありません。

必要なことをどのように行うかは正確にはわかりませんが、.NET に組み込まれている標準の並べ替えがあまり役に立たないと思います。

于 2010-07-08T14:17:30.553 に答える
0

MCommand クラスを IComparable にサブスクライブさせることができます。これを行うと、追加の Comparer オブジェクトを必要とせずに、リストで図形を並べ替えることができます。すべてのソート機能は、リストとその中のオブジェクトによって処理されます。

于 2010-07-08T14:27:34.790 に答える