代码之家  ›  专栏  ›  技术社区  ›  Ribtoks

Ruby(1.8.7)与C#/.NET中的SortedDictionary有什么相似之处?

  •  1
  • Ribtoks  · 技术社区  · 14 年前

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jörg W Mittag    14 年前

    现在在核心库或标准库中没有任何东西可以满足您的要求。

    在那里 但是, a feature request to add a Red/Black-Tree implementation

    如果你能强迫你的用户只使用 XRuby JRuby ,您可以只使用Java的一个实现 java.util.SortedMap<K, V> 例如 java.util.TreeMap<K, V> .

    如果你能强迫你的用户只使用 Ruby.NET IronRuby ,您可以使用.NET的 System.Collections.Generic.SortedDictionary<TKey, TValue> .

    如果你能强迫你的用户只使用磁共振成像或YARV,你可以使用 Ruby/RBTree Rubinius the not-yet-released JRuby 1.6 . 注意,这个库中似乎有多个独立的更新分叉。不明显,哪一个是最新和/或维护最好的。

    这个 我知道的解决方案保证是便携的,是 Kanwei Li's Algorithms and Containers GSoC 2008 project Containers::RBTreeMap based on a Red/Black-Tree Containers::SplayTreeMap based on a Splay Tree

        2
  •  0
  •   Charlotte    14 年前

    如果没有人有更好的建议,你可能得自己把这个卷起来。

    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"]
    

    数组是按键排序的,所以它们可以是任意调用的,您只需要在它们上定义比较运算符。

        3
  •  -2
  •   DEVMBM    14 年前

    在c#SortedDictionary中使用同一类:

    SortedDictionary keyValues=新的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");