[email protected] å??é?ï¼?
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.
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.