У меня есть ArrayList объектов MCommand (cmdList), и я хочу отсортировать его так, чтобы фигуры с ближайшими точками были рядом друг с другом в ArrayList. Например, скажем, у меня есть три строки в ArrayList:
линия (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 может содержать пару тысяч элементов, и мне нужна эффективная сортировка.