By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
437,693 Members | 1,972 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 437,693 IT Pros & Developers. It's quick & easy.

How to compare 2 hashes of arrays by values(not keys)

P: 34
Hi
I have hashes with arrays to its keys like,
%h1 = ('a'=>['abc','def'],
'b'=>['ghi','jkl'],
'c'=>['hop','uio']
);

%h2 = ('a'=>['abc','def'],
'b'=>['wert','wer']);
then, how can i compare the 2 hashes(based on values. not keys) and get distinct values ?


Any solution will be appreciated.....
Aug 27 '08 #1
Share this Question
Share on Google+
10 Replies


nithinpes
Expert 100+
P: 410
The question is not very clear. I am not understanding with what criteria you want to compare the values of hashes(which are inturn arrays-compare lengths or elements of array??) . Also, let us know what have you tried so far.
However, to begin with if you are trying to get values of the hash, you may use 'values' keyword.
e.g.
Expand|Select|Wrap|Line Numbers
  1.  foreach(values %h1) {
  2.   print "@{$_}\n";   ## will print values of hash %h1(the array elements)
  3. }
  4.  
Aug 27 '08 #2

P: 34
Thanks for responding.
i want to compare the values of %h1 with values of %h2 and the final result will be

( the values of %h1, which are in %h1 and not in %h2)
Result is :

['ghi' , 'jkl' ]
[ 'hop' ' uio']

(since, these are not in %h2).
I want the above output. How can i do this?????
Aug 27 '08 #3

nithinpes
Expert 100+
P: 410
Thanks for responding.
i want to compare the values of %h1 with values of %h2 and the final result will be

( the values of %h1, which are in %h1 and not in %h2)
Result is :

['ghi' , 'jkl' ]
[ 'hop' ' uio']

(since, these are not in %h2).
I want the above output. How can i do this?????
You can make use of Data::Compare module to compare data structures in perl.

Expand|Select|Wrap|Line Numbers
  1. use Data::Compare;
  2. use strict;
  3.  
  4. my %h1 = ('a'=>['abc','def'],
  5. 'b'=>['ghi','jkl'],
  6. 'c'=>['hop','uio']
  7. );
  8. my %h2 = ('a'=>['abc','def'],
  9. 'b'=>['wert','wer']);
  10.  
  11. foreach my $x (values %h1) {
  12.   my $i=0;
  13.  foreach my $y (values %h2) {
  14.   $i=1 if(Compare($x,$y));
  15. }
  16.   print "@{$x}\n" if($i==0);
  17. }
  18.  
Aug 27 '08 #4

P: 34
Thanks alot. This seems,it solves 99% of my problem.But
in my hashes are like,
my %h1 = ('a'=>['abc','def'],
'b'=>['ghi','jkl'],
'c'=>['hop','uio'],
'd'=>['iooo','qwe']
);
my %h2 = ('x'=>['abc','def'],
'b'=>['wert','wer']
'd'=>['iooo','qwe']
);
Even though, the values are same, I want the output as,
I want to match both keys and values.
So the Optput will come as,
['iooo','qwe'].

so, for your code, i add,


use Data::Compare;
use strict;
my %h1 = ('a'=>['abc','def'],
'b'=>['ghi','jkl'],
'c'=>['hop','uio'],
'd'=>['iooo','qwe']
);
my %h2 = ('x'=>['abc','def'],
'b'=>['wert','wer'],
'd'=>['iooo','qwe']
);
foreach my $x (values %h1)
{
my $i=0;
foreach my $y (values %h2)
{
$i=1 if(Compare($x,$y) && Compare($h1{$x},$h2{$y}) );
}
print "@{$x}\n" if($i==0);
}



but, This doesn't work.... Please help me out..... Thank you
Aug 28 '08 #5

KevinADC
Expert 2.5K+
P: 4,059
first you said:

how can i compare the 2 hashes(based on values. not keys)

now you say:

I want to match both keys and values

which is it?
Aug 28 '08 #6

P: 34
sorry for inconvenience.

As per my Hod Instructions and also regarding my application, ineed to do the aleternate post also..


Firstly I tried, but didn't get result.
How can I Solve this problem. Please help me out.
Aug 28 '08 #7

nithinpes
Expert 100+
P: 410
Thanks alot. This seems,it solves 99% of my problem.But
in my hashes are like,
my %h1 = ('a'=>['abc','def'],
'b'=>['ghi','jkl'],
'c'=>['hop','uio'],
'd'=>['iooo','qwe']
);
my %h2 = ('x'=>['abc','def'],
'b'=>['wert','wer']
'd'=>['iooo','qwe']
);
Even though, the values are same, I want the output as,
I want to match both keys and values.
So the Optput will come as,
['iooo','qwe'].
Your initial question is entirely different from your current requirement. However, you can make use of the same code and modify it to suit your requirement.
To display the value of the key-value pairs that are common in both hashes:
Expand|Select|Wrap|Line Numbers
  1. use Data::Compare;
  2. use strict;
  3.  
  4. my %h1 = ('a'=>['abc','def'],
  5. 'b'=>['ghi','jkl'],
  6. 'c'=>['hop','uio'],
  7. 'd'=>['iooo','qwe']
  8. );
  9. my %h2 = ('x'=>['abc','def'],
  10. 'b'=>['wert','wer'],
  11. 'd'=>['iooo','qwe']
  12. );
  13.  
  14. foreach my $x (keys %h1) {
  15.   my $i=0;
  16.  foreach my $y (keys %h2) {
  17.   $i=1 if(Compare($x,$y) && Compare($h1{$x},$h2{$y}) );
  18. }
  19.   print "@{$h1{$x}}\n" if($i==1);
  20. }
  21.  
  22.  
Output will be:
Expand|Select|Wrap|Line Numbers
  1.  iooo qwe 
  2.  
  3.  
Aug 28 '08 #8

P: 34
Thanks alot nithinpes

Your Logic wroks well for me.


Thank alot.


Its great forum.
Aug 28 '08 #9

P: 34
I tried like this.....................

while(my($k1,$v1) = each(%h1))
{
my $i = 0;
while(my($k2,$v2) = each(%h2))
{
$i = 1 if(Compare($v1,$v2) && Compare($k1,$k2));
}
print "@{$v1}\n" if($i==0);
}


This works fine and yours also works for me...............
Thank you............
Aug 28 '08 #10

P: 3
Hello,
I have a different question on hash of arrays.
The programming language I am using is perl.

I have the following:
%a=(A1=>[UP1,UP3,UP6],
A2=>[UP1,UP6],
A3=>[UP2,UP10],
);

%b=(UP1=>[UP2,UP3,UP7],
UP2=>[UP10,UP9,UP3],
UP5=>[UP1,UP11],
);

Please keep in mind that the keys are different, so I can't compare them.

Desired output:
A1 has values UP1, UP3, UP6.
Among these, only UP1 is a key in %b.
The values of UP1 are UP2, UP3, UP7. I have to compare these 3 values with the values in %a. Whichever key in %a has any of these values, I have to print them.

Example: A1 has UP1, UP3, UP6. UP1 key has values UP2, UP3, UP7. Among these, UP2 has the key A3 and UP3 has the key A1.
So output is: A1-A3,A1.

I hope this explanation is clear. Please let me know if there are any doubts.
Mar 2 '12 #11

Post your reply

Sign in to post your reply or Sign up for a free account.