ruby(1.8.7)のアナログは、c#/。netのsortdictionaryへのアナログとは何ですか?

StackOverflow https://stackoverflow.com/questions/4117139

  •  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");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top