Как сравнить содержимое массива Ruby и хеша? - PullRequest
1 голос
/ 10 февраля 2012

У меня есть массив Ruby с таким содержимым:

my_array
=> ["MPA5534285", "MPA5534555", "MPA553asdf5", "MPA553asdasdfasdfaf5"]

У меня есть хэш Ruby, подобный этому:

1.9.2p290 :012 > hash
 => {"MPA5534555"=>"something", "MPA553sf"=>"something", "MPA55345asdf5adfads"=>"something", "MPA553asdasdfasdfaf5"=>"something"} 

Мне нужно сравнить массив с хешем и найти, где нет соответствующих совпадений.

Например, в моем массиве у меня есть «MPA5534555», который, если я смотрю в хэш, ключ существует. Но в массиве «MPA5534285» нет ключа в хэше.

Мне нужен массив, в котором есть только те, у которых нет ключей в хэше.

Ответы [ 3 ]

6 голосов
/ 10 февраля 2012
a = ["MPA5534285", "MPA5534555", "MPA553asdf5", "MPA553asdasdfasdfaf5"]

h = {"MPA5534555"=>"something", "MPA553sf"=>"something", "MPA55345asdf5adfads"=>"something", "MPA553asdasdfasdfaf5"=>"something"} 


a - h.keys
# => ["MPA5534285", "MPA553asdf5"] 
5 голосов
/ 10 февраля 2012

Этот вариант немного быстрее, чем a - h.keys (он все равно выполняется за кадром при вычитании массивов, только в этом случае перефразировка h.keys не обязательна):

a.reject{ |e| h.has_key?(e) }
2 голосов
/ 10 февраля 2012

Всегда интересно посмотреть, как решения сравниваются по скорости:

require 'benchmark'

my_array = ["MPA5534285", "MPA5534555", "MPA553asdf5", "MPA553asdasdfasdfaf5"]
hash = {
  "MPA5534555"           => "something",
  "MPA553sf"             => "something",
  "MPA55345asdf5adfads"  => "something",
  "MPA553asdasdfasdfaf5" => "something"
}

n = 1_000_000

puts "For #{ n } loops:"
3.times do
  Benchmark.bm(8) do |b|
    b.report('keys')     { n.times { my_array - hash.keys                    } }
    b.report('has_key?') { n.times { my_array.reject{ |e| hash.has_key?(e) } } }
  end
end

Который при запуске выдает:

ruby ~/Desktop/test.rb 
For 1000000 loops:
              user     system      total        real
keys      3.910000   0.000000   3.910000 (  3.908089)
has_key?  2.590000   0.000000   2.590000 (  2.590154)
              user     system      total        real
keys      3.930000   0.010000   3.940000 (  3.934498)
has_key?  2.580000   0.000000   2.580000 (  2.583171)
              user     system      total        real
keys      3.940000   0.000000   3.940000 (  3.936036)
has_key?  2.590000   0.000000   2.590000 (  2.589483)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...