2016-07-21 4 views
0

Мне нужно сравнить 2 хэша в рубине, где один из хеш содержит числовые значения в кавычной строке, что делает эту строку. Рассмотрим следующие 2 хэшей:сравнить два хэша в рубине

hash1 = {"A"=>"0", "B"=>"1", "SVHTID"=>"VH", "D"=>"0", "E"=>"19930730", "F"=>"TEST - DEPOSIT", "G"=>"2.25000000"} 

hash2 = {"a"=>"0", "b"=>1, "c"=>"VH", "d"=>0,"e"=>19930730, "f"=>"TEST - DEPOSIT", "g"=>2.25} 

Теперь код я написал до сих пор выглядит следующим образом:

hash2 = Hash[hash2.map {|key, value| [key.upcase, value] }] 

hash1.each{|k,v| hash1[k] = hash1[k].to_i if hash1[k].match(/-?\d+(?:\.\d+)?/)} 

hash1.keys.select { |key| hash1[key] != hash2[key] }.each { |key| 

puts "expected #{key} => #{hash1[key]}, but found #{key} => #{hash2[key]}" 

    } 

что делает то, что он также преобразует значение с плавающей точкой в ​​целое и оригинальное значение потерял.

Что я хочу, что при сравнении выше 2 хэш на выходе должен содержать только G, как несоответствующий тип и следующие должны быть напечатано:

Expected: G=>2.25000000 but found G=>2.25 
+0

Каким должен быть результат, когда хэш содержит тот же символ, что и нижний, и верхний регистр? – Dutow

ответ

0
# normalization 
h1, h2 = [hash1, hash2].map do |h| 
    h.map do |k, v| 
    [k.to_s.downcase, v.to_s.to_i.to_s == v.to_s ? v.to_i : v] 
    end.to_h 
end 

Теперь мы готовы сравнить:

h1.reject { |k, v| h2[k].nil? || h2[k] == v } 
#⇒ { "g" => "2.25000000" } 

Это может быть напечатано, отформатировано и так далее, как вы хотите.

+0

Спасибо за ответ, что если в будущем я хочу округлить значение g, а также совпадать, значит, 2.25000000 округляется до 2.25 и соответствует значению hash2 [g] –

+2

Тогда в будущем вы спросите другой вопрос здесь о SO, или принять ответ, приведенный выше, для работы с поплавками, а также с целыми числами. – mudasobwa

+0

Thats really rude .. в любом случае спасибо ... –

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