tags:

views:

338

answers:

1

I want to add elements to my Hash lists, which can have more than one value. Here is my code. I don't know how I can solve it!

class dictionary

  def initialize(publisher)             
    @publisher=publisher
    @list=Hash.new()                    
  end

  def []=(key,value)
    @list << key unless @list.has_key?(key)
    @list[key] = value
  end

end


dic = Dictionary.new

dic["tall"] = ["long", "word-2", "word-3"]

p dic

Many thanks in advance.

regards,

koko

+2  A: 

I think this is what you're trying to do

class Dictionary
  def initialize()
    @data = Hash.new { |hash, key| hash[key] = [] }
  end
  def [](key)
    @data[key]
  end
  def []=(key,words)
    @data[key] += [words].flatten
    @data[key].uniq!
  end
end

d = Dictionary.new
d['tall'] = %w(long word1 word2)
d['something'] = %w(anything foo bar)
d['more'] = 'yes'

puts d.inspect
#=> #<Dictionary:0x42d33c @data={"tall"=>["long", "word1", "word2"], "something"=>["anything", "foo", "bar"], "more"=>["yes"]}>

puts d['tall'].inspect
#=> ["long", "word1", "word2"]

Edit

Now avoids duplicate values thanks to Array#uniq!.

d = Dictionary.new
d['foo'] = %w(bar baz bof)
d['foo'] = %w(bar zim)     # bar will not be added twice!

puts d.inspect
#<Dictionary:0x42d48c @data={"foo"=>["bar", "baz", "bof", "zim"]}>
macek
The OP seemed to want to avoid duplicates, so you might want to use a Set instead of an Array for the hash values.
glenn jackman
@glenn, this avoids duplicate keys.
macek
@macek and @glenn Do you means something like that?def []=(key,value) if [email protected]?(keys) @data[key] << value else @data[value] = Set.new() end return @data[key] = [value]endregards,koko
@kokogyi, you need to paste a set of inputs and expected output or I can't help you any further. Edit your question and I'll try to help.
macek
@macek, not duplicate *keys*, but duplicate *values* -- `d['foo'] = 'bar'; d['foo']=%w{bar baz}; d['foo'] # ==> ["bar", "bar", "baz"]`
glenn jackman
@glenn, fixed. See edit :)
macek