我需要在Ruby(1.8.7)中保存分类哈希的值。哪些数据构造最适合?

有帮助吗?

解决方案

核心库或标准库中没有任何东西可以符合您的账单。

那里 , , 然而, 添加红色/黑树实现的功能请求 到Ruby 1.9.3/2.0。

如果您能够强迫用户只使用 Xruby 或者 jruby, ,您可以使用Java的实现之一 java.util.SortedMap<K, V>java.util.TreeMap<K, V>.

如果您能够强迫用户只使用 ruby.net 或者 铁瑞, ,您可以使用.NET的 System.Collections.Generic.SortedDictionary<TKey, TValue>.

如果您能够强迫用户只使用MRI或YARV,则可以使用 Ruby/RBTree 图书馆。它可能也可以 卢比尼乌斯 或者 尚未发行的Jruby 1.6. 。请注意,野外似乎有多个独立的更新叉。这并不明显,其中之一是最新和/或最好的维护。

只要 解决方案我知道哪些是可移植的,是 Kanwei Li的算法和容器GSOC 2008项目, ,实际上包含两个分类的键指标集合的实现: 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中使用同一类:

sortedDictionary 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