Can I check contain value in hash?

I have hash which is contain list of string value.
I need to check is the value already contained in the key.
And add the value to the key if the key is not contained that value.
Can I do that?

like in c#

if(!dict[key].contains(value))
{
dict[key].add(value);
}

On Wed, Apr 20, 2011 at 6:02 AM, Siratinee S.
[email protected] wrote:

}
You can try the code. A similar approach to the c# above could use
methods Hash#has_key?
(http://ruby-doc.org/core-1.8.7/classes/Hash.html#M000515),
Array#include
(http://ruby-doc.org/core-1.8.7/classes/Array.html#M000343)
and Array#<<
(http://ruby-doc.org/core-1.8.7/classes/Array.html#M000306).

Although if your arrays can grow and so you are checking include? many
times on big arrays, you might want to use a Set instead of an Array.

Jesus.

On Wed, Apr 20, 2011 at 10:33 AM, Brian C. [email protected]
wrote:

dict[key][val] = true

To get the values, you’d then use dict[key].keys (which in ruby 1.8
would be in an arbitrary order, and in 1.9 would be in order of first
insertion)

My first choice would be to use Set and not Hash as values.

require ‘set’

dict = Hash.new {|h,k| h[k] = Set.new}

dict[key] << val
dict[key].include? val

Kind regards

robert

Robert K. wrote in post #993961:

My first choice would be to use Set and not Hash as values.

OK, although Set is really just a thin wrapper around Hash(*), and I
find it easier to work with objects of one class instead of a two.

Regards,

Brian.

(*) example methods from class Set:

def size
@hash.size
end

def empty?
@hash.empty?
end

def clear
@hash.clear
self
end

def to_a
@hash.keys
end

def include?(o)
@hash.include?(o)
end

def add(o)
@hash[o] = true
self
end

def delete(o)
@hash.delete(o)
self
end

For some applications,

dict[key] << val
dict[key].uniq!

will be good enough. But this will still slow down if the number of
values in the list gets large, in which case a hash of hashes would be
better:

dict[key] ||= {}
dict[key][val] = true

To get the values, you’d then use dict[key].keys (which in ruby 1.8
would be in an arbitrary order, and in 1.9 would be in order of first
insertion)

On Wed, Apr 20, 2011 at 5:25 PM, Brian C. [email protected]
wrote:

Robert K. wrote in post #993961:

My first choice would be to use Set and not Hash as values.

OK, although Set is really just a thin wrapper around Hash(*), and I
find it easier to work with objects of one class instead of a two.

In this case the difference is probably rather small but generally I
try to use the best abstraction. In this case “a collection which
contains every element at most once” translates directly to “set” for
me. :slight_smile:

Kind regards

robert

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs