Что такое аналог Ruby (1.8.7) для SortedDictionary в C # /. NET? - PullRequest
1 голос
/ 07 ноября 2010

Мне нужно хранить значения в отсортированном хэше в ruby ​​(1.8.7). Какие данные лучше всего подойдут?

Ответы [ 3 ]

1 голос
/ 07 ноября 2010

В базовой библиотеке или стандартной библиотеке нет ничего, что соответствовало бы вашему счету.

Там - это , однако запрос на добавление реализации Red / Black-Tree в Ruby 1.9.3 / 2.0.

Если вы можете заставить своих пользователей только когда-либо использовать 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 или на еще не выпущенном JRuby 1.6 . Обратите внимание, что в дикой природе существует несколько независимых обновленных вилок этой библиотеки. Неясно, какой из них является самым последним и / или лучше всего поддерживается.

Известное решение only , которое, как я знаю, гарантированно будет переносимым, - это проект Kanwei Li «Алгоритмы и контейнеры 2008» , который фактически содержит две реализации отсортированного, проиндексированного по ключу коллекция: Containers::RBTreeMap на основе красного / черного дерева и Containers::SplayTreeMap на основе Splay Tree .

0 голосов
/ 07 ноября 2010

Возможно, вам придется свернуть это самостоятельно, если у кого-то еще нет лучшего предложения.

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

Массив сортируется по ключам, поэтому они могут быть любого вызова, и вам просто нужно определить операторы сравнения для них.

0 голосов
/ 07 ноября 2010

Использовать тот же класс в 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");
...