Re: preserve sort order in another list



"Jim Gibson" <jgibson@xxxxxxxxxxxxxxxxx> wrote in message
news:050520051241241521%jgibson@xxxxxxxxxxxxxxxxxxxx
> In article <XZqdnUK9wc7TyOffRVn-2w@xxxxxxxxxxxx>, Brett
> <bg1343d@xxxxxxxxxxx> wrote:
>
> > "Jürgen Exner" <jurgenex@xxxxxxxxxxx> wrote in message
> > news:8Tmee.2706$Vu.1954@xxxxxxxxxxx
> > > 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.


.



Relevant Pages

  • Re: "Sorting" assignment
    ... And many others prefer to call partition exchange because "quicksort" ... bin B depending on whether it is greater than, ... If the array is already sorted, this means that you end up ... attempt to sort them. ...
    (comp.programming)
  • Re: A Fast sorting algorithm for almost sorted data
    ... far my compressor has potential but is nowhere near ready. ... It does however make heavy use of sorting. ... which I am currently calling Run sort. ... entire selected run can be added to the sorted output array. ...
    (comp.compression)
  • A Fast sorting algorithm for almost sorted data
    ... which I am currently calling Run sort. ... entire selected run can be added to the sorted output array. ... public class RunSort implements Comparator ... public static void sort(Comparable a, int start,int end) ...
    (comp.compression)
  • Re: Save & Sort
    ... You can copy your array to a scratch ... "Heap" sort. ... Dim lst As Long ... Dim tmp As String ...
    (microsoft.public.excel.programming)
  • Re: Sorting Arrays via VBS / JScript
    ... > I need to sort the file/Array first so I can do proper reading. ... > ' Now that I have the File in the array. ... dim myIn, myhelpr ... set oSort = WScript.CreateObject ...
    (microsoft.public.scripting.wsh)