什么是Ruby(1.8.7)类似于C#/ .NET中的SortedDictionary?

我需要在ruby(1.8.7)中按排序哈希值保存值。 哪些数据最适合?

现在核心库或标准库中没有任何内容可以满足您的需求。

但是, 有一个function请求要向Ruby 1.9.3 / 2.0 添加Red / Black-Tree实现 。

如果您能够强制您的用户只使用XRuby或JRuby ,您可以使用Java的java.util.SortedMap一个实现,例如java.util.TreeMap

如果您能够强制您的用户只使用Ruby.NET或IronRuby ,您可以使用.NET的System.Collections.Generic.SortedDictionary

如果您能够强制您的用户只使用MRI或YARV,您可以使用Ruby/RBTree库。 它也可能适用于Rubinius或尚未发布的JRuby 1.6 。 请注意,该库中似乎存在多个独立更新的分支叉。 不明显的是,哪一个是最新的和/或最好的维护的一个。

我所知道的唯一可以保证可移植的解决方案是Kanwei Li的算法和容器GSoC 2008项目 ,它实际上包含一个有序的,键索引集合的两个实现: Containers::RBTreeMap基于红/黑树和Containers::SplayTreeMap基于Containers::SplayTreeMap树的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");