2014-03-06 32 views
1

我想實現icomparer或其他形式的列表排序比較來排序vector3s的列表。實現具有3個或更多參數的排序機制

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); 
    } 
} 

如果有人知道如何與3倍的值或者我應該尋找排序與3個值的列表實施的IComparer,我將不勝感激。

+0

這是什麼語言? C#? (編輯:我添加了'c#'標籤作爲猜測,有人請修正,如果不正確。) –

+1

看起來像c#,雖然有一些錯誤和其他問題 – miniBill

回答

3

首先,我實際上並不知道您要發佈什麼語言,我無法識別它。但是,這個答案是相當語言不可知的,所以請翻譯回您的首選語言。我猜對了下面的語法。

你需要找到一種方法,參數和計算搜索度量標準,使得任何兩個物體ab可以根據排序過程中無需額外的信息標值明顯訂購。

例如,如果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與排序操作期間的spot1spot2相關。

+0

謝謝,這正是我所需要的。基地將是不變的,我不想在我的課堂上申報,所以我正在尋找一種方法來傳遞3個值來進行比較(這不是工作,但是是我當時最好的想法),或者創建一個像你這樣的比較器內部的值。非常感謝^^ linq的想法看起來不錯,但我真的需要學習linq,因爲我還沒有做很多。 – Charles

1

這不可能與IComparer<T>,也不是傳統。

一個排序 - Compare的結果表示 - 是針對兩個的值完成的。這是編入界面,並提供了三個值沒有規定。

sort algorithm(接受一個的IComparer或任何代碼)將多次應用排序函數超過值作爲必需的。


我懷疑你真的想在比較函數中「訪問」一個通用的基向量(避免關鍵字,btw)最簡單的方法是將其作爲的構造函數參數提供,並將其作爲比較器對象的成員字段進行存儲/訪問。

3

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

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

什麼!棒極了!有時間學習一些C#。 –

+1

@Jason這只是IEnumerable擴展方法的語法糖,它是靜態輔助方法的語法糖。結果簡單易讀 – miniBill

相關問題