Реализация механизма сортировки с 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.