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

preserve sort order in another list

P: n/a
I have two arrays and i wish to sort the first one numerically, but after
sorting, I would like the second array to be in the same matching order as
the first array.

ie.

@l1={3,1,2};
@l2={'a','b','c'};

@l1 = sort {$a <=> $b} (@l1); # sort list @l1 to be {1,2,3}

# do something to @l2 to make order {'b','c','a'} (preserving the original
mapping with the first list)

There's probably an easy way to do this that i'm not aware of.

Thanks in advance,
Brett.
Jul 19 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
Brett wrote:
I have two arrays and i wish to sort the first one numerically, but
after sorting, I would like the second array to be in the same
matching order as the first array.

ie.

@l1={3,1,2};
@l2={'a','b','c'};

@l1 = sort {$a <=> $b} (@l1); # sort list @l1 to be {1,2,3}

# do something to @l2 to make order {'b','c','a'} (preserving the
original mapping with the first list)

There's probably an easy way to do this that i'm not aware of.


Indeed, there is: use a data structure that matches your problem better.
Instead of having a pair of unrelated arrays use a single array of pairs.
And then sort that single array by the value of the first component of each
pair.

jue
Jul 19 '05 #2

P: n/a
"Jürgen Exner" <ju******@hotmail.com> wrote in message
news:8Tmee.2706$Vu.1954@trnddc07...
Brett wrote:
I have two arrays and i wish to sort the first one numerically, but
after sorting, I would like the second array to be in the same
matching order as the first array.

ie.

@l1={3,1,2};
@l2={'a','b','c'};

@l1 = sort {$a <=> $b} (@l1); # sort list @l1 to be {1,2,3}

# do something to @l2 to make order {'b','c','a'} (preserving the
original mapping with the first list)

There's probably an easy way to do this that i'm not aware of.
Indeed, there is: use a data structure that matches your problem better.
Instead of having a pair of unrelated arrays use a single array of pairs.
And then sort that single array by the value of the first component of

each pair.

jue

I'm new to this, and tried to give it a go.

struct ID =>
{
number => '$',
name => '$',
};

my @IDs = ID->new();
#fill data...

@IDs = sort {$a->number <=> $b->number} (@IDs); # numeric sort on number

but that failed to sort the list as i expected. How can i use sort to do
what I want?
Jul 19 '05 #3

P: n/a
In article <XZ********************@adelphia.com>, Brett
<bg*****@hotmail.com> wrote:
"Jürgen Exner" <ju******@hotmail.com> wrote in message
news:8Tmee.2706$Vu.1954@trnddc07...
Brett wrote:
I have two arrays and i wish to sort the first one numerically, but
after sorting, I would like the second array to be in the same
matching order as the first array.

ie.

@l1={3,1,2};
@l2={'a','b','c'};

@l1 = sort {$a <=> $b} (@l1); # sort list @l1 to be {1,2,3}

# do something to @l2 to make order {'b','c','a'} (preserving the
original mapping with the first list)

There's probably an easy way to do this that i'm not aware of.


Indeed, there is: use a data structure that matches your problem better.
Instead of having a pair of unrelated arrays use a single array of pairs.
And then sort that single array by the value of the first component of

each
pair.

jue

I'm new to this, and tried to give it a go.

struct ID =>
{
number => '$',
name => '$',
};

my @IDs = ID->new();
#fill data...

@IDs = sort {$a->number <=> $b->number} (@IDs); # numeric sort on number

but that failed to sort the list as i expected. How can i use sort to do
what I want?


Please post a complete program so we can see where you are going wrong,
but post it to comp.lang.perl.misc because this newsgroup is defunct.

Here is a version that uses an array of array references to an array of
two elements, as Jürgen suggested:

#!/usr/local/bin/perl

use strict;
use warnings;

my @l1 = qw/ 3 1 2 /;
my @l2 = qw/ a b c /;

my @ids = map { [ $l1[$_], $l2[$_] ] } (0..$#l1);

print "Unsorted Array:\n";
for my $r ( @ids ) {
print " @$r\n";
}
print "\nSorted array:\n";
foreach my $r ( sort { $a->[0] <=> $b->[0] } @ids ) {
print " @$r\n";
}

__OUTPUT__

Unsorted Array:
3 a
1 b
2 c

Sorted array:
1 b
2 c
3 a
----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! >100,000 Newsgroups
---= East/West-Coast Server Farms - Total Privacy via Encryption =---
Jul 19 '05 #4

P: n/a
"Jim Gibson" <jg*****@mail.arc.nasa.gov> wrote in message
news:050520051241241521%jg*****@mail.arc.nasa.gov. ..
In article <XZ********************@adelphia.com>, Brett
<bg*****@hotmail.com> wrote:
"Jürgen Exner" <ju******@hotmail.com> wrote in message
news:8Tmee.2706$Vu.1954@trnddc07...
Brett wrote:
> I have two arrays and i wish to sort the first one numerically, but
> after sorting, I would like the second array to be in the same
> matching order as the first array.
>
> ie.
>
> @l1={3,1,2};
> @l2={'a','b','c'};
>
> @l1 = sort {$a <=> $b} (@l1); # sort list @l1 to be {1,2,3}
>
> # do something to @l2 to make order {'b','c','a'} (preserving the
> original mapping with the first list)
>
> There's probably an easy way to do this that i'm not aware of.

Indeed, there is: use a data structure that matches your problem better. Instead of having a pair of unrelated arrays use a single array of pairs. And then sort that single array by the value of the first component of

each
pair.

jue

I'm new to this, and tried to give it a go.

struct ID =>
{
number => '$',
name => '$',
};

my @IDs = ID->new();
#fill data...

@IDs = sort {$a->number <=> $b->number} (@IDs); # numeric sort on number
but that failed to sort the list as i expected. How can i use sort to do
what I want?


Please post a complete program so we can see where you are going wrong,
but post it to comp.lang.perl.misc because this newsgroup is defunct.

Here is a version that uses an array of array references to an array of
two elements, as Jürgen suggested:

#!/usr/local/bin/perl

use strict;
use warnings;

my @l1 = qw/ 3 1 2 /;
my @l2 = qw/ a b c /;

my @ids = map { [ $l1[$_], $l2[$_] ] } (0..$#l1);

print "Unsorted Array:\n";
for my $r ( @ids ) {
print " @$r\n";
}
print "\nSorted array:\n";
foreach my $r ( sort { $a->[0] <=> $b->[0] } @ids ) {
print " @$r\n";
}

__OUTPUT__

Unsorted Array:
3 a
1 b
2 c

Sorted array:
1 b
2 c
3 a

Thanks, i'll report to the other group. I'd like to stick with the
structures, since they look a bit easier.

Brett.
Jul 19 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.