私はC#で新しいです。私はヒープ構造を作成しようとしましたが、この質問を思いつきました。ヒープ構造に「比較クラス」を渡すにはどうすればいいですか?つまり、私はヒープを作成したいと思っています:Heap<int, cmp<int>> heap = new Heap<int, cmp<int>>();
"cmp"はヒープを優先順位にする比較クラスです(私はC++のpriority_queueという考え方を取っていました)。C#でジェネリック型の比較クラスを渡す
public class Heap<T, Priority>
where Priority : IPriority<T>, new()
where T : IComparable
{
private List<T> storage = new List<T>();
private Priority HeapPriority = new Priority();
private void UpHeap(int position)
{
for(var i = position; i > 0; i = (i - 1) >> 1)
{
// Check whether storage[i] is more Priority than storage[(i - 1) >> 1]
if (HeapPriority.MorePriority(storage[i], storage[(i - 1) >> 1])
.CompareTo(storage[i]) == 0)
{
storage.Swap(i, (i - 1) >> 1);
}
else break;
}
}
}
、ここではIPriorityインタフェースである:私は最大 - 最小比較子を取るヒープを作る際に(と思う)成功してい
public interface IPriority<T>
where T : IComparable
{
T MorePriority(T a, T b);
}
と私はこのようなヒープの使用:
public class Min<T> : IPriority<T>
where T : IComparable
{
public Min() { }
public T MorePriority(T a, T b)
{
return a.CompareTo(b) <= 0 ? a : b;
}
}
static public void TestHeap()
{
var heap = new Heap<Pair<long, int>, Min<Pair<long, int>>>();
heap.Add(Pair<long, int>(10, 20));
heap.Add(Pair<long, int>(21, 100));
// ...
}
しかし、max-minオーダーだけでなく、必要な方法でアイテムをソートするヒープが必要です。さらに、 "Ipriority.MorePriority"を静的メソッドとして使用する方法はありますか?静的メソッドと同じように機能するためです。誰も私にいくつかのアドバイスを与えることができますか? 私の悪い英語を申し訳ありません。
明白な答えは、 'IComparer'を使用することです。なぜあなたはいないのですか?問題にアプローチする方法はたくさんあります。 _something_を試してください。その後、_specific_質問がある場合は、あなたが持っている特定の問題を明確に示す良い[mcve]で新しい質問を投稿してください。 –
ありがとうございます。ちゃんと覚えておきますよ。これは私の最初の質問ですので、何か愚かな質問をおかけして申し訳ありません –
愚かな質問はありません。ここで問題となるのは、可能な回答を調査していることを示す兆候はなく、決して解決策を実装しようとする際にどのような問題があったかは心配しないことです。あなたが明白なことを見逃していればそれはいいですし、それは実際には答えですが、明白な答えを逃した人さえもおそらく_何かを試すでしょう。 –