2015-03-02 2 views
-1

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

Сначала я следующий набор данных, собранных с кучей файлов обработанных -
Booka - section1, section2
BookB - section2, Раздел 4

Я чч = Hash.new {| ч, K | ч [к] = {}} и хранить его как -

hh[BookA][section1] = BookA 
hh[BookA][section2] = BookA 
hh[BookB][section2] = BookB 
hh[BookB][section4] = BookB 

Но мне нужно напечатать все это следующим образом -
section1 - Booka
section2 - Booka
section2 - BookB
Раздел 4 - BookB

Любые предложения, как это сделать ....

Так что я создал
h = Hash.new {| H, K | h [k] = []}
section_hash = Hash.new ([])
Iterating -
h.each do | k, v |
v.each do | s |
пут "# {s} - # {к}"
ФЕ [s] < < к
конца
конца
пут Fh
Он печатает все правильно, но СПЧ ноль, любая идея, что не так .. .. выход из пут команды
s1 - b1
s2 - b1
s2 - b2

+2

Я не совсем уверен, что вы пытаетесь сделать. Вы пытаетесь ... объединить все книги для любого раздела? Затем распечатайте их в разделе-порядке? –

+0

Thats correct Taryn. Чтение кучи файлов, в которых есть книга и все ее разделы. И, наконец, нужно распечатать для каждого раздела, что у всех книг есть этот раздел. – chappalprasad

+0

----------------------- – chappalprasad

ответ

0

Я хотел бы сделать это с помощью раздела в качестве хеш-ключа, как го является:

# so this will create a new empty array for any keys we add 
section_hash = Hash.new([]) 

# you can grab out the lines of the file or use each to do it line by line. 
book_lines = File.readlines("my_file.txt") 

# now go through each of these and add the data into the hash 
book_lines.each do |line| 

    # convert each line to a key/value pair 
    # eg "BookA - section1, section2" 
    # {"BookA" => ["section1", "secton2"]} 
    book, sections = line.split(" - ") 
    sections = sections.split(', ')  

    # and hash away these values 
    sections.each do |section| 
    section_hash[section] << book 
    end 
end 

, то вы можете напечатать с:

section_hash.each do |section, books| 
    # you may choose to uniq (in case of double ups) 
    books.uniq.each do |book| 
    puts "#{section} - #{book}" 
    end 
end 
Смежные вопросы