Имеется ли в ruby ​​тип списка, в котором содержимое сортируется по мере добавления / удаления? - PullRequest
9 голосов
/ 23 января 2010

Мне нужна структура данных в Ruby, которая сортирует свои элементы при добавлении или удалении элементов и позволяет (по крайней мере) извлекать первый элемент из списка.

Самая близкая вещь, которую я нашел в документах ruby, это SortedSet . Однако, похоже, это не обеспечивает какого-либо способа доступа к элементам по их индексу (или даже к отключению первого элемента)

Это конкретные операции, которые мне нужны:

  • Добавить объект в список
  • Удаление первого объекта из списка
  • Проверить, есть ли объект в списке
  • Удалить объект из списка (по объекту, а не по индексу)

Есть ли в ruby ​​что-нибудь встроенное для этого, или есть какие-нибудь библиотеки, которые я могу взять, которые мне это дадут? Я мог бы реализовать его без особых затруднений, но я бы предпочел использовать уже существующий, если это возможно.

В настоящее время я использую Ruby 1.8, хотя переключение на 1.9, вероятно, будет в порядке.

EDIT:

Так как кажется, что есть некоторая путаница, мне нужна сортировка не по порядку вставки объектов. Мне нужно, чтобы сортировка была основана на операторе <=>. Как правило, я получаю первый элемент, обрабатывая его (который может генерировать новые элементы), добавляя новые элементы в список, а затем повторяя. Добавляемые элементы могут оказаться в любом месте в порядке сортировки, а не только в конце.

Ответы [ 2 ]

4 голосов
/ 23 января 2010

может захотеть создать этот 1.8-совместимый драгоценный камень для красных черных деревьев, который делает это (Ruby / RBTree):

http://www.geocities.co.jp/SiliconValley-PaloAlto/3388/rbtree/README.html

дерево всегда сбалансировано, операции с деревом выполняются O (log N)

здесь также есть реализация красного черного дерева:

http://github.com/kanwei/algorithms

Контейнеры :: RubyRBTreeMap

1 голос
/ 24 января 2010

Хотя неэффективно (если вы часто его используете), SortedSet имеет метод to_a, который вы можете использовать для доступа к элементам:

s = SortedSet.new
s << 1
s << 0
s << 3
puts s.to_a[0] # => 0
...