459,203 Members | 1,560 Online
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
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" 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 , Brett wrote: "Jürgen Exner" 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" wrote in message news:050520051241241521%jg*****@mail.arc.nasa.gov. .. In article , Brett wrote: "Jürgen Exner" 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.