ruby(1.8.7)のアナログは、c#/。netのsortdictionaryへのアナログとは何ですか?
-
29-09-2019 - |
質問
Ruby(1.8.7)のソート付きハッシュの値を保持する必要があります。構造化されたデータはどのようなデータに適合しますか?
解決
コアライブラリや標準ライブラリには、請求書に合うものは何もありません。
三 は, 、 でも、 赤/ブラックツリーの実装を追加するための機能要求 Ruby 1.9.3/2.0に。
ユーザーに使用されるように強制できる場合 Xruby また Jruby, 、Javaの実装の1つだけを使用できます java.util.SortedMap<K, V>
そのような java.util.TreeMap<K, V>
.
ユーザーに使用されるように強制できる場合 ruby.net また Ironruby, 、.NETを使用することができます System.Collections.Generic.SortedDictionary<TKey, TValue>
.
ユーザーにMRIまたはYARVのみを使用するように強制できる場合は、 Ruby/RBTree
図書館。それも機能するかもしれません ルビニウス また まだリリースされていないJruby 1.6. 。野生には、その図書館の複数の独立した更新フォークがあるように見えることに注意してください。明らかではありません。それらのうちの1つは、最新および/または維持されているものです。
それだけ どちらがポータブルであることが保証されていることを知っている解決策 Kanwei LIのアルゴリズムとコンテナGSOC 2008プロジェクト, 、実際には、ソートされたキーインデックス付きコレクションの2つの実装が含まれています。 Containers::RBTreeMap
赤/ブラックツリーに基づいています と Containers::SplayTreeMap
スプレーツリーに基づいています.
他のヒント
他の誰もより良い提案を持っていないなら、あなたはこれを自分で転がさなければならないかもしれません。
class SortedHash
def initialize
@data = []
end
def [](k)
@data.find {|kp,vp| kp == k}.last
end
def []=(k, v)
@data.reject! {|kp,vp| kp == k}
@data << [k, v]
@data = @data.sort_by {|kp,vp| kp}
end
def each(&b)
@data.each(&b)
end
end
sh = SortedHash.new
sh[32] = "no"
sh[1] = "later"
sh[99] = "after"
sh.each do |k,v|
p [k,v]
end
出力:
[1, "later"]
[32, "no"]
[99, "after"]
配列はキーでソートされるため、任意の呼び出しを可能にすることができ、それらの比較演算子を定義するだけです。
c#sorteddictionaryで同じクラスを使用します。
sortedictionary keyvalues = new sorteddictionary();
keyValues.Add(5,"sample5");
keyValues.Add(2, "sample2");
keyValues.Add(6, "sample6");
keyValues.Add(8, "sample8");
keyValues.Add(9, "sample9");
keyValues.Add(1, "sample1");