Реализация механизма сортировки с 3 или более параметрами

Я пытаюсь реализовать icomparer или какой-либо другой вид сравнения сортировки списка, чтобы отсортировать список vector3s.

Vector3s сравниваются с опорным вектором3, а затем сортируются на основе их расстояний.

Я не могу понять, как заставить IComparer разрешить 3 параметра или как отсортировать мой список по третьему параметру.

По сути, именно так я и пытаюсь разобраться.

Class VectorSorter : IComparer<Vector3>
{
    public int Compare(Vector3 base, Vector3 spot1, Vector3 spot2)
    {
        return (base-spot1).magnitude.CompareTo((base-spot2).magnitude);
    }
}

Если кто-нибудь знает, как реализовать IComparer с 3 значениями или где я должен искать сортировку списка с 3 значениями, я был бы признателен.

3 ответа

Решение

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

Вам нужно найти способ параметризации и вычисления поисковой метрики так, чтобы любые два объекта a а также b может быть четко упорядочен на основе скалярного значения без дополнительной информации во время сортировки.

Например, если base является постоянной для данной операции сортировки:

Class VectorSorter : IComparer<Vector3> {

    private Vector3 base;

    public VectorSorter (Vector3 base) { 
       this.base = base; 
    }

    public int compare (Vector3 spot1, Vector3 spot2) {
       return (base-spot1).magnitude.CompareTo((base-spot2).magnitude);
    }

}

Тогда вы проходите new VectorSorter(theBaseToUseWhenSorting) в качестве компаратора для вашей функции сортировки.

Если base не является константой, то вам нужно будет найти другой способ выразить свой набор данных, с четким естественным порядком; возможно, создать какой-нибудь объект, содержащий результаты вычислений, затем отсортировать список этих объектов на основе скалярного результата вычисления и т. д. Я не могу дать вам более конкретный совет (или даже хороший пример), не зная больше о том, как base коррелирует с spot1 а также spot2 во время операции сортировки.

Если это C#, вы можете воспользоваться LINQ.

return from v in list
       select v
       orderby (v - base).magnitude;

Это невозможно с IComparer<T> и не является общепринятым.

Упорядочение, которое указывается в результате сравнения, выполняется по двум значениям. Это кодифицировано в интерфейсе, и не предусмотрено трех значений.

Алгоритм сортировки (или любой код, который принимает IComparer) будет применять функцию упорядочения несколько раз по двум значениям, как требуется.


Я подозреваю, что вы действительно хотите "иметь доступ" к общему базовому вектору (избегайте ключевых слов, кстати) в функции сравнения; Самый простой способ сделать это - предоставить его в качестве аргумента конструктора и сохранить / получить к нему доступ как поле члена объекта Comparer.

Другие вопросы по тегам