Creating hashes with duplicate keys

S

Sy Ali

I want to simplify this hash creation:
g = { 1 => "test", 2 => "test", }

I have a particularly complicated hash that I'm generating. It can
have very large values.

Right now, I duplicate values with something like this:

c = { 1 => "one", }
d = { 2 => c[1], }
c.merge!(d)

however, I don't like the way my code looks.. I want to be able to
specify the duplication within the hash generation.

Is this possible?
 
F

Farrel Lifson

I want to simplify this hash creation:
g = { 1 => "test", 2 => "test", }

I have a particularly complicated hash that I'm generating. It can
have very large values.

Right now, I duplicate values with something like this:

c = { 1 => "one", }
d = { 2 => c[1], }
c.merge!(d)

however, I don't like the way my code looks.. I want to be able to
specify the duplication within the hash generation.

Is this possible?

Something like this?
irb(main):001:0> c={}
=> {}
irb(main):002:0> c[1] = "one"
=> "one"
irb(main):003:0> c[2] = c[1]
=> "one"
irb(main):004:0> c[1].object_id == c[2].object_id
=> true

Farrel
 
D

Daniel Schierbeck

Sy said:
I want to simplify this hash creation:
g = { 1 => "test", 2 => "test", }

I have a particularly complicated hash that I'm generating. It can
have very large values.

Right now, I duplicate values with something like this:

c = { 1 => "one", }
d = { 2 => c[1], }
c.merge!(d)

however, I don't like the way my code looks.. I want to be able to
specify the duplication within the hash generation.

Is this possible?

This will work:

hsh = Hash.new{|h, k| h[k] = (k == 1 ? "one" : h[k - 1])}

Note that all the values will be the same -- the same object! If you
want duplicates, do this instead:

hsh = Hash.new{|h, k| h[k] = (k == 1 ? "one" : h[k - 1].dup)}

Just ask if there are parts of the snippet you don't understand.


Cheers,
Daniel
 
P

Peña, Botp

fr Sy:
# I want to simplify this hash creation:
# g =3D { 1 =3D> "test", 2 =3D> "test", }
# ...
# however, I don't like the way my code looks.. I want to be able to
# specify the duplication within the hash generation.

not sure if this simple idea will help, but,

irb(main):055:0> class Hash
irb(main):056:1> def init2 range
irb(main):057:2> range.each{|c| self[c]=3Dself.default}
irb(main):058:2> end
irb(main):059:1> end
=3D> nil
irb(main):060:0> h=3DHash.new
=3D> {}
irb(main):065:0> h.default =3D "test"
=3D> "test"
irb(main):066:0> h.init2 1..8
=3D> 1..8
irb(main):067:0> h
=3D> {5=3D>"test", 6=3D>"test", 1=3D>"test", 7=3D>"test", 2=3D>"test", =
8=3D>"test", 3=3D>"test", 4=3D>"test"}
irb(main):068:0> h.default =3D "testing again"
=3D> "testing again"
irb(main):069:0> h.init2 6..10
=3D> 6..10
irb(main):070:0> h
=3D> {5=3D>"test", 6=3D>"testing again", 1=3D>"test", 7=3D>"testing =
again", 2=3D>"test", 8=3D>"testing again", 3=3D>"test", 9=3D>"testing =
again", 4=3D>"test", 10=3D>"testing again"}
irb(main):071:0>

kind regards -botp
 
A

ara.t.howard

I want to simplify this hash creation:
g = { 1 => "test", 2 => "test", }

I have a particularly complicated hash that I'm generating. It can
have very large values.

Right now, I duplicate values with something like this:

c = { 1 => "one", }
d = { 2 => c[1], }
c.merge!(d)

however, I don't like the way my code looks.. I want to be able to
specify the duplication within the hash generation.

Is this possible?

use rbtree (from the raa)

harp:~ > cat a.rb
require 'rbtree'

rb = RBTree.new

rb[1] = 'test'
rb[2] = 'test'

rb.each{|k,v| p [k,v]}


harp:~ > ruby a.rb
[1, "test"]
[2, "test"]

regards.

-a
 
A

ara.t.howard

use rbtree (from the raa)

harp:~ > cat a.rb
require 'rbtree'

rb = RBTree.new

rb[1] = 'test'
rb[2] = 'test'

rb.each{|k,v| p [k,v]}


harp:~ > ruby a.rb
[1, "test"]
[2, "test"]

yikes - hit send too soon, here ya go:

harp:~ > cat a.rb
require 'rbtree'

rb = MultiRBTree.new

rb[1] = 'test'
rb[1] = 'test'

rb.each{|k,v| p [k,v]}

p rb.to_a
p rb[1]


harp:~ > ruby a.rb
[1, "test"]
[1, "test"]
[[1, "test"], [1, "test"]]
"test"


-a
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top