"be consistent" PerlMonks

### How to Test if Two Arrays are Ordered in the Same Way

by monkfan (Curate)
 on Jun 06, 2005 at 05:44 UTC Need Help??

monkfan has asked for the wisdom of the Perl Monks concerning the following question:

This is an attempt to save a thread in SoPW which I thought can be useful for others.

There are already incredible answers in the thread, so feel free to check in SoPW.
Please don't misunderstand me. I honestly think this can be useful. I don't mean to boost my XP here, or in that thread which I posted.

Here I wanted to test if an array is of a _same order_ with another, left array is always be greater/superset or equal to the right one. Here is my current code.
```#!/usr/bin/perl -w

# The original code here is constructed
# thanks to ysth's suggestion

use strict;
my @AR  = qw(a b c);   # First Case
my @ar  = qw(z a b c); # Second Case

my @ar2 = qw(b a);
my @ar3 = qw(a b);
my @ar4 = qw(a b c);
my @ar5 = qw(z a b c);

print "First case\n";
#                   L     R
print test_ordered(\@ar,\@ar2),"\n"; # Answer:False(0)
print test_ordered(\@ar,\@ar3),"\n"; # Answer:True(1)
print test_ordered(\@ar,\@ar4),"\n"; # Answer:True(1)
print test_ordered(\@ar,\@ar5),"\n"; # Answer:True(1)

print "Second case\n";
print test_ordered(\@AR,\@ar2),"\n"; # Answer: False(0)
print test_ordered(\@AR,\@ar3),"\n"; # Answer: True(1)
print test_ordered(\@AR,\@ar4),"\n"; # Answer: True(1)

sub test_ordered
{
#test if two arrays are ordered in same way
#assuming no duplicate and left array is always
#be greater/superset or equal to the right one

#    L    R
my (\$ar1,\$ar2)= @_;

my %h;

@h{@\$ar1} = (0..\$#{\$ar1});
my \$decision = grep(\$h{\$ar2[\$_]} != \$_, 0..\$#{\$ar2}) ? 0 : 1;

return \$decision;
}
Currently the code give correct answer for the Second Case. How can I modify it such that it's also correct for the First Case?
Now it prints:
```First Case:       Second Case:
0                 0
0                 1
0                 1
1
The desired answer is:
```First Case:       Second Case:
0                 0
1                 1
1                 1
1
Regards,
Edward
<code>

Originally posted as a Categorized Question.

Replies are listed 'Best First'.
Re: How to Test if Two Arrays are Ordered in the Same Way
by jdhedden (Deacon) on Jun 06, 2005 at 16:23 UTC
Your decision line needs to be:
```    my \$decision = grep(\$h{\$\$ar2[\$_-1]} > \$h{\$\$ar2[\$_]}, 1..\$#{\$ar2})
+? 0 : 1;
You have to take into account the elements order with respect to each other. In this case, pos1 <= pos2 <= pos3 ...
Re: How to Test if Two Arrays are Ordered in the Same Way
by monkfan (Curate) on Jun 09, 2005 at 12:23 UTC
Ok, this is one the answer given by most revered tlm to me the other day:
```sub test_ordered {
my ( \$ref, \$test ) = @_;

# \$i scans the indices of @\$ref;
# \$matched keeps count of # of elements matched in @\$test;

my ( \$i, \$matched ) = ( 0, 0 );
OUTER: for ( @\$test ) {
while ( \$i < @\$ref or return 0 ) {
if ( \$ref->[ \$i++ ] eq \$_ ) {
last OUTER if ++\$matched == @\$test;
last;
}
}
}
return 1;
}
More can be found here. Don't vote my root posting but vote those remarkable answers you will find there.

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://463839]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2023-03-21 04:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Which type of climate do you prefer to live in?

Results (59 votes). Check out past polls.

Notices?