2015-07-14 3 views
1

Я пропустил путь в угол, где мне теперь нужно сравнить значения хэша с соответствующим элементом в массиве.Сравнение значений хэша с соответствующими значениями массива в Ruby

У меня есть два «списка» одинаковых значений, отсортированных по-разному, и они должны быть одинаковыми. Интересная часть - это когда они этого не делают, поэтому мне нужно определить эти случаи. Поэтому в основном мне нужно проверить, совпадает ли первое значение первой пары ключ-значение в хэше, идентичном первому элементу массива, а также второе значение, проверенное ко второму элементу и т. Д. Для всего набора значений в хэш.

Я вроде новичок в Ruby, сценариев, но, хотя это должно быть достаточно легко, но увы ....

+1

Можете ли вы добавить пример того, что вам нужно? – JCorcuera

+0

что-то вроде этого? {a: 2, b: 3} .to_a == [[: a, 2], [: b, 3]] дайте нам пример, если вы можете –

+0

Добро пожаловать в переполнение стека. Хотя ваше описание красивое, оно ничего не говорит нам. Нам нужно увидеть образец ваших данных, показать нам, что вы пробовали, и, что более важно, объяснить, что именно вы на самом деле пытаетесь сделать, потому что, как есть, это звучит как проблема [XY] (http: //meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

ответ

2

Похоже, все, что вам нужно что-то простое, как:

hash.keys == array 

keys должны выходить в том же порядке, что и в Hash, поэтому это сравнение первого ключа хэша с первым элементом массива, второй ключ со вторым элементом массива, ...

Вы можете также транслитерируйте то, что вы говорите в Ruby, как это:

hash.each_with_index.all? { |(k, _), i| k == array[i] } 

Или вы могли бы сказать:

hash.zip(array).all? { |(k, _), e| k == e } 

версия zip в значительной степени версия each_with_index с индексацией массива в основном сложенной в zip.

+0

Спасибо! Поскольку меня интересовали случаи, когда значения хэша (отсортированные по ключам) не были идентичны значениям массива, тогда 'hash.values! = Array' сделал трюк! –

+0

В этом случае вы также можете переключить два других, чтобы использовать 'any?' И '! =', Если вам понравилось. –

0

Технически говоря, хеш не гарантируется, поэтому ваше предположение о совпадении значения с индексом «каждый» хеша может не всегда оставаться верным. Однако, ради ответа на свой вопрос, предполагая, что час ваш хэш, и ваш массив:

list_matches = true 
h.values.each_with_index {|v, i| list_matches = list_matches && a[i] == v} 

если list_matches не равно верно, чем то, где элементы в двух коллекциях не совпадают ,

+1

Технически говоря, Hash in Ruby гарантированно будет заказано: [«Хэши перечисляют свои значения в том порядке, в котором были вставлены соответствующие ключи».] (Http://ruby-doc.org/core-2.2.2/Hash .html). Если, конечно, вы не работаете с каменной версией Ruby. –

Смежные вопросы