From: uncutstone wu Date: 2006-05-17T02:46:30+09:00 Subject: Re: In search of elegant indices searching Nuralanur@aol.com 写道: > Dear all, > > I have a Hash, with equal-length Arrays as values, something like > > my_hash={'x',[1,1,3,1,5,6],'w',[1,2,3,1,4,5],'y',[1,1,1,4,4,6],'z',[0,1,1,2,3, > 4]} . > > Some of the values in the Arrays occur several times. > Now, I am looking for an elegant way to extract, for all the values > of specified keys, all the indices > where one or more variables do not change their values, i.e., something > like > > class Hash > def fixed_vars(which_vars) > > # some elegant code > return result > end > end > > res=my_hash.fixed_vars(['x','w']) > > giving > > res={{'x'=>1,'w'=>1}=>[0,3],{'x'=>3,'w'=>3}=>[2],{'x'=>5,'w'=>4}=>[4],{'x'=>6, > 'w'=>5}=>[5]}. > Indeed, I really don't fully understand what you want , and the code below is hacked out and is definitively not elegant. But it works, and gives what you want . module MyHash def fixed_vars(key1, key2) res = {} def res.[](key) self.each do |akey, aval| if akey == key return aval end end nil end a1 = self[key1] a2 = self[key2] len = a1.length recorded = [] len.times do |i| if a1[i] == a2[i] h = {key1=>a1[i],key2=>a2[i]} res[h]=[] if res[h] == nil res[h] << i recorded << a1[i] end end len.times do |i| if a1[i] != a2[i] and (not recorded.include?(a1[i])) and (not recorded.include?(a2[i])) res[{key1=>a1[i],key2=>a2[i]}] = [] if res[{key1=>a1[i],key2=>a2[i]}] == nil res[{key1=>a1[i], key2=>a2[i]}] << i end end return res end end def testmy_hash my_hash={'x',[1,1,3,1,5,6],'w',[1,2,3,1,4,5], 'y',[1,1,1,4,4,6],'z',[0,1,1,2,3,4]} my_hash.extend MyHash res = my_hash.fixed_vars('x','w') puts res.inspect end testmy_hash Best regards. -- Posted via http://www.ruby-forum.com/.