#ruby #arrays #hash
#ruby #массивы #хэш
Вопрос:
У меня есть массив:
a = [1,2,3,4,5]
Учитывая любую строку «бла» или «whee», я хочу последовательно возвращать возвращаемое значение из массива:
myfunc("blah") -> 1
myfunc("whee") -> 2
myfunc("three") -> 3
myfunc("blah") -> 1
Есть предложения? Я использую ruby, но подойдет любой псевдокод. Строка на самом деле будет URL-адресами, поэтому я не знаю заранее о возможностях.
Их будет ограниченное число, но, вероятно, около 50 000, поэтому было бы лучше избегать хранения каждого из них.
Я бы хотел примерно случайное распределение, но если оно искажено или один элемент встречается очень редко, это нормально.
Спасибо за вашу помощь!
Комментарии:
1. Вопрос не ясен. 1, 2, 3, 1 не согласуется. Вы упомянули «бла» и «уи», но чем они отличаются от других строк?
2. похоже, вам нужен хэш с h[url] = h.size
3. добавлен пример решения, который можно расширить на
4. Вероятно, следует отредактировать вопрос вместо добавления ответа. Итак, у вас есть массив из N элементов, и вы хотите последовательно сопоставлять заданную строку с одним и тем же элементом, но, кроме повторяемости, не важно, с каким индексом он сопоставляется?
Ответ №1:
Если я правильно понимаю, вы хотите вернуть элемент из массива для любой строки, вам все равно, какой элемент, но вы хотите, чтобы он был одинаковым каждый раз.
Если это так, вы можете использовать hash
метод:
def myfunc(obj)
a = [1,2,3,4,5]
a[obj.hash % a.size]
end
myfunc("blah") -> 5
myfunc("whee") -> 4
myfunc("three") -> 2
myfunc("blah") -> 5
Комментарии:
1. 1 То, что нужно оператору, — это операция хеширования. Это единственный правильный ответ, ИМХО.
2. Вероятность того, что разные строки вернут одно и то же число, велика. Кроме того, это приведет к разным числам в разных сеансах Ruby.
3. Есть метод «хеширования», приятно! Это было бы идеально, за исключением того, что, как говорит стинслэг, это не согласуется между сеансами ruby. Итак, я пока работаю с ответом Тьяго, спасибо, очень информативно!
Ответ №2:
Я думаю, вы идете в правильном направлении.
my_array = [1,2,3,4,5]
"whee".split('').collect {|c| c.ord}.inject{|sum, x| sum x} % my_array.size
Используя это, вы всегда будете сопоставлять строку с индексом в массиве.
Кроме того, вместо 1,2,3,4… вы можете создать ту же ассоциацию, используя любые уникальные случайные числа в массиве, поскольку операнд mod возвращает индекс, а не значение.