Сортировка ArrayList форм - PullRequest
0 голосов
/ 08 июля 2010

У меня есть 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 может содержать пару тысяч элементов, и мне нужна эффективная сортировка.

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Что я мог сделать не так?

Вы предполагаете, что элементы будут представлены вам в определенном порядке - вы помните «предыдущий» элемент, которыйОгромный красный флаг.

То, как работают различные сорта, вообще не поможет.В основном ваш компаратор должен быть без гражданства.Похоже, у вас нет полного порядка здесь - нет никакого способа взять любые два произвольных элемента и сказать, какой должен быть до или после другого.

Я не знаю точно, как вы 'я буду делать все, что вам нужно, но я не думаю, что стандартная сортировка, встроенная в .NET, очень вам поможет.

0 голосов
/ 08 июля 2010

Вы можете сделать свой класс MCommand подписанным на IComparable. При этом вы позволите вашему списку сортировать фигуры без необходимости в дополнительном объекте сравнения. Все функции сортировки будут обрабатываться списком и объектами в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...