0
我正在創建一個簡單的二進制最小堆。我很清楚Binary堆是如何工作的,並且實現它們不是問題。然而,我在如何實現一個通用Binary堆(在這種情況下是一個小堆)方面遇到了困難,因爲我想在我的樹中存儲對象(而不是ints/float/double/etc等),並且有我想要比較的成員以便向上或向下鼓泡物體。如何:通用二進制最小堆比較成員對象
有沒有解決這樣的事情?
我正在創建一個簡單的二進制最小堆。我很清楚Binary堆是如何工作的,並且實現它們不是問題。然而,我在如何實現一個通用Binary堆(在這種情況下是一個小堆)方面遇到了困難,因爲我想在我的樹中存儲對象(而不是ints/float/double/etc等),並且有我想要比較的成員以便向上或向下鼓泡物體。如何:通用二進制最小堆比較成員對象
有沒有解決這樣的事情?
是的,你只需要將T的通用類型約束爲IComparable<T>
。
例如:
public sealed class BinaryMinHeap<T> where T: IComparable<T>
{
...
然後在那裏你比較你的T類型的元素,你這樣做:
if (element.CompareTo(otherThing) > 0)
...
(從哪兒的CompareTo()的返回值的符號告訴你的順序)
內置類型如int
,double
和string
全部實現IComparable<T>
,所以這種方法也適用於他們。
或者,您可以傳入Comparison<T>
代表以用於比較元素。然後,類型T將不必執行IComparable<T>
。
有關使用Comparison<T>
的某些示例,請參見Array.Sort<T>()
。
但我如何在if語句中進行比較?我不清楚如何指定要比較的成員/財產。 – Sidar 2013-02-27 12:32:10
@Sidar:你會如何比較兩個int?我會選擇後一種解決方案('Comparison'或'IComparer '),以避免必須實現接口(並且它還允許您每次使用不同的屬性進行排序)。 –
Groo
2013-02-27 12:34:29
也許我沒有得到它。當然,比較整數是微不足道的。但在我的情況下,我必須指定一個成員/財產。這可能與我將分別存儲在我的樹中的不同對象有所不同。 – Sidar 2013-02-27 12:38:07