preserve sort order in another list

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Brett

    preserve sort order in another list

    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.


  • Jürgen Exner

    #2
    Re: preserve sort order in another list

    Brett wrote:[color=blue]
    > 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.[/color]

    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


    Comment

    • Brett

      #3
      Re: preserve sort order in another list

      "Jürgen Exner" <jurgenex@hotma il.com> wrote in message
      news:8Tmee.2706 $Vu.1954@trnddc 07...[color=blue]
      > Brett wrote:[color=green]
      > > 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.[/color]
      >
      > 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[/color]
      each[color=blue]
      > pair.
      >
      > jue[/color]


      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?


      Comment

      • Jim Gibson

        #4
        Re: preserve sort order in another list

        In article <XZqdnUK9wc7TyO ffRVn-2w@adelphia.com >, Brett
        <bg1343d@hotmai l.com> wrote:
        [color=blue]
        > "Jürgen Exner" <jurgenex@hotma il.com> wrote in message
        > news:8Tmee.2706 $Vu.1954@trnddc 07...[color=green]
        > > Brett wrote:[color=darkred]
        > > > 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.[/color]
        > >
        > > 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[/color]
        > each[color=green]
        > > pair.
        > >
        > > jue[/color]
        >
        >
        > 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?[/color]

        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 =---

        Comment

        • Brett

          #5
          Re: preserve sort order in another list

          "Jim Gibson" <jgibson@mail.a rc.nasa.gov> wrote in message
          news:0505200512 41241521%jgibso n@mail.arc.nasa .gov...[color=blue]
          > In article <XZqdnUK9wc7TyO ffRVn-2w@adelphia.com >, Brett
          > <bg1343d@hotmai l.com> wrote:
          >[color=green]
          > > "Jürgen Exner" <jurgenex@hotma il.com> wrote in message
          > > news:8Tmee.2706 $Vu.1954@trnddc 07...[color=darkred]
          > > > 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[/color][/color][/color]
          better.[color=blue][color=green][color=darkred]
          > > > Instead of having a pair of unrelated arrays use a single array of[/color][/color][/color]
          pairs.[color=blue][color=green][color=darkred]
          > > > And then sort that single array by the value of the first component of[/color]
          > > each[color=darkred]
          > > > pair.
          > > >
          > > > jue[/color]
          > >
          > >
          > > 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[/color][/color]
          number[color=blue][color=green]
          > >
          > > but that failed to sort the list as i expected. How can i use sort to do
          > > what I want?[/color]
          >
          > 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[/color]


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

          Brett.


          Comment

          Working...