Link to home
Start Free TrialLog in
Avatar of NewtonianB
NewtonianB

asked on

sorting one array, matching the second one

I have two arrays of strings, the left one needs to be natural sorted, I can do this however array2 has to be modified to maintain the index consistency.

@array1   @array2
1 --> b      1 --> bla
2 --> d      2 --> bla2
3 --> a1    3 --> bla3
4 --> a10  4 --> bla4
5 --> a20  5 --> bla5
6 --> a2    6 --> bla6

1 --> a1    1 --> bla3
2 --> a2    2 --> bla6
3 --> a10  3 --> bla4
4 --> a20  4 --> bla5
5 --> b      5 --> bla
6 --> d      6 --> bla2

i'm using a modified version of tye algorithm found on perkmonkey site for the natsort on array1 but then how would I order array2.

my @sorted = @list[
    map { unpack "N", substr($_,-4) }
    sort
    map {
        my $key = $list[$_];
        $key =~ s[(\d+)][ pack "N", $1 ]ge;
        $key . pack "N", $_
    } 0..$#list
];

Would you use a two dimensional array instead?
I want to make sure i'm doing this the most efficient way as the list can get long, any help appreciated
Avatar of Adam314
Adam314

I think a 2D array (or actually an array-of-arrays) would be better.  Here is an example:

my @array1 = (qw(b d a1 a10 a20 a2));
my @array2 = (qw(bla bla2 bla3 bla4 bla5 bla6));
 
##### Build array of array
my @AoA;
for(my $i=0; $i<=$#array1; $i++) {
	push @AoA, [$array1[$i], $array2[$i]];
}
 
##### Sort
my @AoA_sorted = sort {$a->[0] cmp $b->[0]} @AoA;
 
##### get original arrays, but sorted
@array1 = map{$_->[0]} @AoA_sorted;
@array2 = map{$_->[1]} @AoA_sorted;

Open in new window

Avatar of NewtonianB

ASKER

Thanks Adam! but It needs to be natural sorted instead of sort which is what's creating my complication, how would I use the above natural sorting algorithm or another one with your code
example of proper sort: a1 b1 a10 b1 b20  instead of  a1 a10 b1 b20
i meant for example a1 a2 a3 a10 a12  instead of  a1 a10 a12 a2 a3
ASKER CERTIFIED SOLUTION
Avatar of Adam314
Adam314

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
that should work! thanks!

Last quick question,
What's the most efficient way to get a 2Dimensional array consisting of the last two columns of array AoA_sorted?

could i just do something like
my @arrayTwoDim = map{$_->[1], $_->[2]} @AoA_sorted;
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
I could not have asked for a better help. Thank you so much!