代码之家  ›  专栏  ›  技术社区  ›  Charles

使用3个或更多参数实现排序机制

  •  1
  • Charles  · 技术社区  · 10 年前

    我正在尝试实现icomparer或其他形式的列表排序比较,以对向量列表进行排序。

    矢量3与参考矢量3进行比较,然后根据它们的距离进行排序。

    我不知道如何让IComparer允许3个参数,或者如何使用第三个参数对列表进行排序。

    基本上,这就是我试图排序的方式。

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

    如果有人知道如何实现具有3个值的IComparer,或者我应该在哪里查找具有3个数值的列表,我会很感激。

    3 回复  |  直到 10 年前
        1
  •  3
  •   Jason C    10 年前

    首先,我不知道你用的是哪种语言,我无法识别。但是,这个答案完全是语言不可知的,所以请翻译回你喜欢的语言。我猜到了下面的语法。

    您需要找到一种方法来参数化和计算搜索度量,以便任何两个对象 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) 作为排序函数的比较器。

    如果 基础 如果不是恒定的,那么您需要找到另一种方式来表达数据集,这种方式具有独特的自然顺序;也许创建一些保存计算结果的对象,然后根据计算的标量结果对这些对象的列表进行排序,等等。如果不了解更多的方法,我真的不能给你任何更具体的建议(甚至是一个好例子) 基础 与…相关 spot1 spot2 在分拣操作期间。

        2
  •  3
  •   miniBill    10 年前

    如果是C#,您可以利用LINQ。

    return from v in list
           select v
           orderby (v - base).magnitude;
    
        3
  •  1
  •   user2864740 BINIT kumar jha    10 年前

    这对于 IComparer<T> ,也不是传统的。

    一个排序-由 Compare -是针对 价值观这被编码到接口中 提供三个值。

    A. sort algorithm (或任何接受IComparer的代码)将应用排序函数 多次 结束 值。


    我怀疑您真的希望在Compare函数中“访问”公共基向量(避免关键字,顺便说一下);最简单的方法是将其作为 构造函数自变量 并将其存储/访问为Comparer对象的成员字段。