vivalon
10/4/2007 11:55:00 AM
On Oct 4, 7:36 pm, "Robert Klemme" <shortcut...@googlemail.com> wrote:
> 2007/10/4, Robert Dober <robert.do...@gmail.com>:
>
>
>
> > On 10/4/07, viva...@gmail.com <viva...@gmail.com> wrote:
> > > I want to create a 2 dimension hash, and init it like
> > > A B C D E
> > > A 0 0 0 0 0
> > > B 0 0 0 0 0
> > > C 0 0 0 0 0
> > > D 0 0 0 0 0
> > > E 0 0 0 0 0
>
> > > then I can set it by ARGV
> > > for example, if ARGV is AB2, BC5, CD7,AE6,CA2, DB3,DE8, EA3, EC9
> > > then the expect result is
> > > A B C D E
> > > A 0 2 0 0 6
> > > B 0 0 5 0 0
> > > C 2 0 0 7 0
> > > D 0 3 0 0 8
> > > E 3 0 9 0 0
>
> > > well, I wrote some codes like this
> > > #############################################
> > > ALL="A".."E"
> > > dimension={}
> > > def init(dime)
> > > tmp={}
> > > ALL.each do |letter|
> > > tmp[letter]=0
> > > end
> > > ALL.each do |letter|
> > > dime[letter]=tmp
> > > end
> > > puts "Testing Init"
> > > ALL.each do |key1|
> > > ALL.each do |key2|
> > > print key1+key2+" value="
> > > puts dime[key1][key2]
> > > end
> > > end
> > > print "Test init is over\n\n"
> > > end
> > > def test(array,dime)
> > > array.each do |arr|
> > > dime[arr[0].chr][arr[1].chr]=Integer(arr[2].chr)
> > > end
> > > puts "Testing"
> > > ALL.each do |key1|
> > > ALL.each do |key2|
> > > print key1+key2+" value="
> > > puts dime[key1][key2]
> > > end
> > > print "\n"
> > > end
> > > print "Test is over\n\n"
> > > end
>
> > > init(dimension)
> > > test(ARGV, dimension)
> > > #############################################
> > > then the result will be
>
> > > A B C D E
> > > A 3 3 9 7 0
> > > B 3 3 9 7 0
> > > C 3 3 9 7 0
> > > D 3 3 9 7 0
> > > E 3 3 9 7 0
>
> > > please tell me why i am wrong?
> > > I thought the "last" decide the whole volume
> > > like EC9 make C volume 9
> > > EA3 make A volume 3
> > > please help me~
> > > thank you so much~
>
> > Sorry for not having more time right now but the pattern recalls shared objects
> > when you do this
>
> > c> dime[letter]=tmp
>
> > in init you share all lines and they will always refer to the same object.
>
> > try this and tell me if that solves your issue
>
> > c> dime[letter]=tmp.dup
>
> > HTH
> > Robert
>
> I guess you are right with regard to the aliasing effect.
>
> Here's another solution:
>
> RKlemme@padrklemme1 /cygdrive/c/SCMws/RKlemme
> $ cat ~/ruby/matrix.rb
> #!ruby
> ALL="A".."E"
> args = %w{AB2 BC5 CD7 AE6 CA2 DB3 DE8 EA3 EC9}
> matrix = Hash.new 0
> args.each do |a|
> d1, d2, v = a.scan /./
> matrix[[d1, d2]] = v.to_i
> end
>
> print " ", ALL.to_a.join(" "), "\n"
> ALL.each do |d1|
> print d1
> ALL.each do |d2|
> print " ", matrix[[d1,d2]]
> end
> print "\n"
> end
>
> require 'pp'
> pp matrix
>
> RKlemme@padrklemme1 /cygdrive/c/SCMws/RKlemme
> $ ~/ruby/matrix.rb
> A B C D E
> A 0 2 0 0 6
> B 0 0 5 0 0
> C 2 0 0 7 0
> D 0 3 0 0 8
> E 3 0 9 0 0
> {["A", "E"]=>6,
> ["A", "B"]=>2,
> ["D", "B"]=>3,
> ["C", "A"]=>2,
> ["E", "C"]=>9,
> ["D", "E"]=>8,
> ["C", "D"]=>7,
> ["E", "A"]=>3,
> ["B", "C"]=>5}
>
> Kind regards
>
> robert
thank you very much for helping me ^O^