ruby noob: являются ли хэши быстрыми и оптимальными для хранения или мне следует создать кортеж? - PullRequest
1 голос
/ 10 сентября 2010

Это довольно простая проблема, над которой я работаю в Ruby, но я абсолютный нуб, поэтому я хочу узнать наиболее правильное решение. У меня есть список данных с именем и значением. Мне нужно запомнить все это (очевидный ответ: хэш). Но мне также нужно помнить порядок этих данных. ТАК это выглядит так:

x=1
y=2
z=3

Я думал о создании массива хэшей из 1 элемента:

[0 => {'x' => 1},
 1 => {'y' => 2},
 2 => {'z' => 3}]

Являются ли хэши лучшим выбором в этой ситуации? Есть ли какая-то причина, по которой они будут медленными или неоптимальными?

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

Используйте Ruby 1.9.Хеши заказываются здесь.

1 голос
/ 10 сентября 2010

Вы можете попробовать OrderedHash из ActiveSupport или Dictionary, используя Ruby Facets.

0 голосов
/ 12 сентября 2010

Если позволяет производительность, будет работать ассоциированный массив.Ассоциативный массив - это массив массивов, каждый из которых содержит два элемента:

a = [
  [:x, 1],
  [:y, 2],
  [:z, 3],
]

. Вы можете использовать assoc для поиска подмассива по его первому элементу:

p a.assoc(:x)         # [:x, 1]
p a.assoc(:x).last    # 1

Или rassoc для поиска подмассива по последнему элементу:

p a.rassoc(2)          # [:y, 2]
p a.rassoc(2).first    # :y

Будет ли этот подход работать для вас, зависит от размера списка и частоты поиска.Это.На моей машине поиск последнего элемента в списке из 1000 элементов занимает около 100 микросекунд.


Другой подход заключается в использовании простого неупорядоченного (в Ruby <= 1.8.7) хэша: </p>

h = {
  :x => 1,
  :y => 2,
  :z => 3,
}

И заказывайте его во время выполнения операции, в которой порядок имеет значение:

sorted_h = h.sort_by do |key, value|
  key.to_s
end.each do |key, value|
  p [key, value]
end
# [:x, 1]
# [:y, 2]
# [:z, 3]

Этот подход хорош для алфавитного или числового упорядочения (например).Это не очень хорошо для порядка вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...