Просто сделай это.
Вы можете просто хэш на массиве ...
Проверка
Позвольте мне показать небольшой эксперимент:
array = [ [1,2], [3,4], ["a", "b"], ["c", 5] ]
hash = {}
array.each do |e|
e2 = e.clone
e << "dummy"
e2 << "dummy"
hash[e] = (hash[e] || 0) + 1
hash[e2] = (hash[e2] || 0) + 1
puts "e == e2: #{(e==e2).inspect}, e.id = #{e.object_id}, e.hash = #{e.hash}, e2.id = #{e2.object_id}, e2.hash = #{e2.hash}"
end
puts hash.inspect
Как вы видите, я беру несколько массивов, клонировать их, изменять их отдельно; после этого мы уверены, что e
и e2
- это разные массивы (т. е. разные идентификаторы объектов); но они содержат одни и те же элементы. После этого два разных массива используются в качестве хеш-ключей; и поскольку они имеют одинаковый контент, хэшируются вместе.
e == e2: true, e.id = 19797864, e.hash = -769884714, e2.id = 19797756, e2.hash = -769884714
e == e2: true, e.id = 19797852, e.hash = -642596098, e2.id = 19797588, e2.hash = -642596098
e == e2: true, e.id = 19797816, e.hash = 104945655, e2.id = 19797468, e2.hash = 104945655
e == e2: true, e.id = 19797792, e.hash = -804444135, e2.id = 19797348, e2.hash = -804444135
{[1, 2, "dummy"]=>2, [3, 4, "dummy"]=>2, ["a", "b", "dummy"]=>2, ["c", 5, "dummy"]=>2}
Как вы видите, вы можете не только использовать массивы в качестве ключей, но он также признает их как «то же самое» (а не какой-то странный идентификатор объекта, который также может быть).
Caveat
Очевидно, что это работает только в одной точке. Содержимое содержимого массивов должно быть четко определено относительно хэширования. Например, вы можете использовать разумные вещи, такие как строки, числа, другие массивы, даже nil
.
Ссылка
От http://ruby-doc.org/core-2.4.0/Hash.html:
Два объекты относятся к одной и той же хэш-ключа, когда их хэш-значение идентично и два объекта EQL? друг другу.
От http://ruby-doc.org/core-2.4.0/Array.html#method-i-eql-3F:
EQL (другие) → истинных или ложных
Возвращает истину, если я и другие такие же объект, или оба массива с одинаковым содержимым (? согласно объекту # eql?).
хэш → целое число
Вычислить хэш-код для этого массива.
Два массива с одинаковый контент будет иметь одинаковый хэш-код (и будет использоваться с использованием eql?).
Emphasis mine.
Можете ли вы использовать строку '' num1: num2''? – Dbz
@Dbz Я не был уверен, что это было бы эффективно: конвертировать числа в строки перед их хэшированием. Но если это наилучший способ, я обязательно буду отмечать это как правильное. – Sunny
- все значения положительные? являются ли они целыми числами? – eiko