2009-09-19 5 views
9

私はかなり専門的なコレクション.NETの必要性があります.BCLが私を助けてくれるとは思いませんが、誰かが似たようなことを知っていれば、私はそれをそこに投げ捨てると思いました。ソートされたキューは.NETに存在しますか?

基本的に、私の要件は、このようにしている:

  • Iは、以下のような値のペアのリストを有する:(3,10)、(5,10)、(3,7)、(5、 5)
  • 注文は重要です。 (3,10)!=(10,3)
  • 個々の値は重複していますが、重複するペアは削除してください(できればサイレント)。
  • キッカーは、私はこのリストが常にソートされている必要があります。私はいつでも並べ替えアルゴリズムによって定義されたリストの最初の値だけに興味があります。だから、

、私が行うことができるようにしたいもののいくつかのサンプルコード(私はそれはおそらく実施される構想として、上記に合わせて他の実装がに問題あり):

public class Pair 
{ 
    public Pair(int first, int second) 
    { First = first; Second = second; } 
    public int First { get; set; } 
    public int Second { get; set; } 
} 

SortedQueue<Pair> foo = new SortedQueue<Pair>((left, right) => { 
    return right.First - left.First; 
}); 

foo.Add(new Pair(10, 3)); 
foo.Add(new Pair(4, 6)); 
foo.Add(new Pair(6, 15)); 
foo.Add(new Pair(6, 13)); // This shouldn't cause a problem 

Pair current = foo.Shift(); // current = (4, 6) 

答えて

11

私は引用:

私はこのリストはすべての時間をソートする必要があります。 私はいつも ソートアルゴリズムによって定義されたリストの最初の 値に興味があります。あなたがないがソートキューしかしPriority Queueたいですかのように

は、これが聞こえます。パフォーマンスが問題であれば、PQは確かに高速ですが、O(log n)対O(n)です。しかし、ドロップ重複の問題では、パラレルHashSet <>を保持する必要があります。

+5

「優先順位キューin .Net」、http://stackoverflow.com/questions/102398/priority-queue-in-net –

+0

適切な名前とリンクをありがとうございました。そして今、私はウィキペディアの記事を見ています。私が実装しようと考えていたのは、 '単純な実装'にリストされている2つのタイプ(ソートされているかどうかのフラグを持つリストを保持し、必要に応じてソートしてから検索してください)。実際の実装にリンクしてくれてありがとうございました。 –

+0

これはA *検索の実装でもありました。これはウィキペディアの記事にもいくつかのメモがあるので、二重の敬称です。 –

5

はあなたを持っていますSortedDictionaryまたはSortedListを見ましたか?

+3

私は盲目になったに違いないと思いました。ただし、問題の1つは、重複キーをサポートしていないという要件です。 –

+0

私はあなたのためのニュースを持っています。マット:あなたがキーが複製されているなら、それは同じオブジェクトです。ここでのレッスンは、Equalsをオーバーライドして、設定した基準で等しくなるようにすることです。 –

+0

私は多くの場合、LINQを手動でオーバーライドするよりも好きです。 – RCIX

0

ソートされたリストは、あなたのPairクラスにIComparableを実装するだけで済むので、自動的に並べ替える必要があります。重複を取り除くために、私はソートされたリストがそれを処理するとは思わないが、あなたはそれを継承し、この機能を追加することができる。

0

SkeetがLookupクラスを使用する可能性が最も高いのはhis answerです。そして、あなたが構築し、このようなもので、それをアクセス:

List<Lookup<int, int>> yourList = new List<Lookup<int, int>>(); 
yourList.Add(new Lookup(3,5)); 
//... 
var list = from item in yourList 
      orderby list.Key //or whatever sort criteria you want here 
      select item; 
//use list 

構文は、1つのまたは2のスポットに少しずれることがありますが、それは動作するはず。

1

現時点では、.NETには何も組み込まれておらず、すべての要件を満たしています。 .NET 4.0にはSortedSetクラスがあります。私はおそらく今あなたのことをよくしていないことを理解しています。

IComparableを実装するとSortedListが近づきます。キーと値としてペアを使用するだけです。 Pairへの参照を2回だけ格納するので、メモリのオーバーヘッドが大きくなりません。しかし、これは重複を考慮しません。

自分で書く方法はたくさんありますが、必要なものと完全に一致するものは何もありません。いくつかのオープンソースSortedSet実装があります(たとえば、Spring.Netには1つあります)。それは今、あなたの最善の策かもしれません。

+0

何度もPerlでハッシュを使用した後/ PHPは設定された型にアクセスするだけで、キーをコレクションに使うたびにハックのように感じてしまい、捨てたい。不幸にも、それが私たちが抱いていることです。しかし!これは個人的なプロジェクトで、既にVS 2010がインストールされているので、結局それを使用するかもしれません... –

2

IntervalHeapまたは優先度キューと呼ばれる、あなたが探しているのと同じように実装されているC5 Generic Collections Libraryを確認してください。ここにC5ブックからのいくつかの文書があります:IPriorityQueue<T>

関連する問題