Что такое Ruby (1.8.7) аналог SortedDictionary в C#/.NET?

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


person Ribtoks    schedule 07.11.2010    source источник
comment
Нет, я имею в виду сортировку по некоторому порядку сортировки, определенному для хеш-ключей.   -  person Ribtoks    schedule 07.11.2010
comment
Это неверно. 1.9 хэши упорядочены, а не отсортированы.   -  person Jörg W Mittag    schedule 07.11.2010


Ответы (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 на основе развернутого дерева.

person Jörg W Mittag    schedule 07.11.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"]

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

person Asherah    schedule 07.11.2010
comment
Да, я знаю это решение, но я не хочу сортировать массив каждый раз при вставке значений... Это неэффективно. Я просто спросил, существует ли решение (может быть, оно использует сбалансированные двоичные деревья или что-то в этом роде) - person Ribtoks; 07.11.2010
comment
По крайней мере, не в стандартной библиотеке. К сожалению :/ - person Asherah; 07.11.2010

Используйте тот же класс в С# 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");
person DEVMBM    schedule 07.11.2010
comment
Мне нужен отсортированный словарь на рубине, а не на С#. Пожалуйста, прочитайте вопрос внимательнее. - person Ribtoks; 07.11.2010