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 には数千の要素を含めることができ、効率的な並べ替えが必要です。