2015-09-04 2 views
0

Учитывая У меня есть хэш:Выберите хэш из коллекции хэш на основе подмножества другой хэш

Grp1: 
    key1: value1 
    key2: value2 
    key3: value3 
Grp2: 
    key1: value4 
    key2: value2 
    key3: value5 

и у меня есть еще один хэш:

key1: value4 
key2: value2 

Я хочу найти в первом наборе хэш и выберите Grp2' key1:value4, потому что Grp2 соответствует этому состоянию. Как мне это сделать?

Примечание: Я попытался использовать команду select и попробовал некоторую логику, предлагаемую ссылками документов. Мои намерения состоят в том, чтобы не получить образец кода, а просто намек. Извините, если мой вопрос звучит так, как будто я прошу ввести код.

+5

Я голосую, чтобы закрыть этот вопрос не по теме, потому что она просит нас, чтобы написать свободный код. –

+0

Бесплатный код - это единственный код, который я пишу, поэтому у меня нет возражений против предложения некоторых. Более того, я знаю, что новички Ruby иногда не знают, с чего начать решать проблему, поэтому я не настаиваю на том, чтобы код отображался как доказательство того, что искатель попытался решить проблему. (Я также помню, что высокопоставленные искатели * никогда не просили показать свой код.) –

+1

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

ответ

3

Что вы называете своим первым хэшем, это не хэш. Фактически, это не объект Ruby. Если это должно быть хэш, вы должны написать это:

g = { :Grp1 => { key1: value1, key2: value2, key3: value3 }, 
     :Grp2 => { key1: value4, key2: value2, key3: value5 } } 

Поскольку ключи все символы, вы можете вместо этого использовать синтаксис:

g = { Grp1: { key1: value1, key2: value2, key3: value3 }, 
     Grp2: { key1: value4, key2: value2, key3: value5 } } 

value1value2 и так on) должен быть либо переменной, либо методом, но вы не дали нам его значение (если это переменная) или его возвращаемое значение (если это метод), поэтому я заменю эти переменные или методы литералами:

g = { Grp1: { key1: 7, key2: 4, key3: 'cat' }, 
     Grp2: { key1: 1, key2: 3, key3: 'dog' } } 

Ваш второй хэш:

h = { :key1 => value4, :key2 => value2 } 

имеет те же проблемы, поэтому я заменить его:

h = { :key1 => 1, :key2 => 3 } 

, которые альтернативно могут быть выражены:

h = { key1: 1, key2: 3 } 

Предполагая, что у меня есть правильно написано, мы можем написать метод следующим образом, используя методы Hash#keys, Hash#key?, Enumerable#find и Enumerable#all?:

def doit(g, h) 
    hkeys = h.keys 
    puts "hkeys=#{hkeys}" 
    g.find do |k,v| 
    puts "k=#{k}" 
    puts "v=#{v}" 
    hkeys.all? do |j| 
     puts " v.key?(#{j})=#{v.key?(j)}" 
     puts " v[#{j}]==#{h[j]}: #{v[j]==h[j]}" 
     v.key?(j) && v[j] == h[j] 
    end 
    end 
end 

Я добавил некоторые puts заявления, так что вы можете увидеть результаты расчетов. Для g и h определенно выше (с буквенными значениями):

doit(g,h) 
hkeys=[:key1, :key2] 
k=Grp1 
v={:key1=>7, :key2=>4, :key3=>"cat"} 
    v.key?(key1)=true 
    v[key1]==1: false 
k=Grp2 
v={:key1=>1, :key2=>3, :key3=>"dog"} 
    v.key?(key1)=true 
    v[key1]==1: true 
    v.key?(key2)=true 
    v[key2]==3: true 
    #=> [:Grp2, {:key1=>1, :key2=>3, :key3=>"dog"}] 

После зачистки из puts заявления и сделать одно небольшое изменение, я бы написать метод так:

def doit(g, h) 
    hkeys = h.keys 
    g.find { |_,v| hkeys.all? { |j| v.key?(j) && v[j] == h[j] } } 
end 

Небольшое изменение что я заменил блочную переменную k на переменную _, чтобы обратить внимание на то, что я не использую ее в блоке.

Существует много способов написать этот метод.Вот другой, используя метод Hash#values_at:

def doit(g, h) 
    hkeys = h.keys 
    hvalues = h.values 
    g.find { |_,v| v.values_at(*hkeys) == hvalues } 
end 
+0

Не могли бы вы отредактировать свой вопрос и задать вопрос 1 и задать вопрос aditya Kumar в качестве комментариев к собственному ответу? Ответы, как и вопросы, должны быть краткими. –

+0

@MaartenBodewes, спасибо за ваше полезное предложение. Казалось более уместным опубликовать комментарии по этому вопросу. –

+0

это было полезно. Благодаря @CarySwoveland –

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