2012-01-30 7 views
3

私は宿題の一部としてC#で一般的なPriorityQueueを実装しています。 アイテムは配列に格納されます。カスタムタイプの比較

class PQueue<T> : IPQueue<T> 
{ 
    T[] items; 
    //.. 
} 

どのように2つのアイテムを比較できますか。私は、PQueueがインスタンス化される型はIComparable/IComparerを実装しなければならないと思います。もしそうなら、どうすればitemsの2つの要素を比較できますか?

これを設計する上品な方法は何ですか。

var cmp = items[i].CompareTo(items[j]); 
if (cmp < 0) { 
    // items[i] is less than items[j] 
} else if (cmp > 0) { 
    // items[i] is greater than items[j] 
} else { 
    // Items are equal 
} 

答えて

3

まず、あなたは<T>IComparable<T>

class PQueue<T> : IPQueue<T> where T : IComparable<T> { 
    T[] items; 
    //.. 
} 

を実装今、あなたは個々の項目を比較することができ、このようにC#ことを伝える必要がありますそのTは実装する必要があります。IComparable

class PQueue<T> : IPQueue<T> where T : IComparable<T> 
{ 
    // ... 
} 
+0

'T:IComparable ' – Nemo

+2

@Nemo制約がなければ、コンパイラは 'items [i]'に 'CompareTo'というメソッドがないことを伝えます。 – dasblinkenlight

0

まず、カスタムタイプ(T)が

どちらのTは「自然」のソート順を持っているなどint型、ダブル、などの数値型で構築されたソート順序を持っている必要があります。カスタムクラスに定義/コード化する必要があります。

おそらく、カスタムクラスの並べ替え順序を決定するために使用できる組み込み型の1つである、いくつかのクラスプロパティまたはプロパティの組み合わせがあります。

アルファベット文字には「自然な」ソート順があります。与えられた文字の小文字の小文字の小文字の並び順は連続していないことに注意してください。文字列に関しては、大文字/小文字が必須ではない場合(ソート目的のために)、文字列を比較する前に文字列を下(または上)に変換します。

任意の列挙型は基本的に整数なので並べ替え順序があります。

のCompareTo()は、カスタムクラスのソート順

This methodは、比較される2つのオブジェクトの順序を決定する「ゴムが道路を満たして」単調なコードで定義しています。 どのようにの作品はあなたが解決しなければならないものです。配列のサイズが固定されているように、内部コレクションとしてごIPQueuesクラス

アレイについて

は良いアイデアのように見えるしていません。 .NETにはQueue classがあります。それはあなたのために働くことができますか?