Мне нужно хранить значения в отсортированном хэше в рубине (1.8.7). Какие структурированные данные подойдут лучше всего?
Что такое Ruby (1.8.7) аналог SortedDictionary в C#/.NET?
Ответы (3)
В основной библиотеке или стандартной библиотеке сейчас нет ничего, что соответствовало бы вашим требованиям.
Однако есть требование добавить красный /Реализация Black-Tree для Ruby 1.9.3/2.0.
Если вы можете заставить своих пользователей использовать только XRuby или JRuby, вы можете просто использовать одну из реализаций java.util.SortedMap<K, V>
, например java.util.TreeMap<K, V>
.
Если вы можете заставить своих пользователей использовать только Ruby.NET или IronRuby, вы можете просто использовать .NET System.Collections.Generic.SortedDictionary<TKey, TValue>
.
Если вы можете заставить своих пользователей использовать только MRI или YARV, вы можете использовать Ruby/RBTree
. Это также может работать на Rubinius или еще не выпущенный 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"]
Массив сортируется по ключам, поэтому они могут быть любого вызова и вам нужно только определить на них операторы сравнения.
Используйте тот же класс в С# 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");