Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

How to sort array by columns maintaining the rows? (for C style arrays)

( #20802=categorized question: print w/ replies, xml ) Need Help??
Contributed by Anonymous Monk on Jul 02, 2000 at 19:32 UTC
Q&A  > arrays


Description:

I want to be able to sort the "double-dimension" array by one of the colums... eg. alphabeticaly by comparing items in column 2 of the array... below some sample data:
$foo[0][0] = "zenia"; $foo[0][1] = "markownikowa"; $foo[0][2] = +"10"; $foo[1][0] = "marek"; $foo[1][1] = "butalski"; $foo[1][2] = +"20"; $foo[2][0] = "teresa"; $foo[2][1] = "parufkowa"; $foo[2][2] = +"90"; $foo[3][0] = "bogumila"; $foo[3][1] = "pierdowa"; $foo[3][2] = +"40"; $foo[4][0] = "genowefa"; $foo[4][1] = "tempawa"; $foo[4][2] = +"50"; First -- let's sort these by the [][1] column... the result should be: marek brutalski 20 zenia markownikowa 10 teresa parufkowa 90 bogumila pierdawa 40 genowefa tempawa 50 sorting by the [][2] column should give us: zenia markownikowa 10 marek brutalski 20 bogumila pierdawa 40 genowefa tempawa 50 teresa parufkowa 90
The manual covers only case of hashes and uses subroutine for comparing items. But how to adopt that for comparing such an array? Thanx in advance... Joustin

Answer: How to sort array by columns maintaining the rows? (for C style arrays)
contributed by QandAEditors

Since these seem to be names, let me add a quick note about sorting on two (or more) columns.

@data = ( [qw(Bubba brutalski 20)], [qw(Bubba brutalski 10)], [qw(JoeBob brutalski 20)], [qw(Jethro brutalski 20)], [qw(Junior brutalski 20)], ); # Sorted by Name (Last, First) @ByName = sort {$a->[1] cmp $b->[1] || $a->[0] cmp $b->[0]} @data; # Sorted by Name, then score @FullSort = sort {$a->[1] cmp $b->[1] || $a->[0] cmp $b->[0] || $a->[2] <=> $b->[2]} @data;
The comparison operators return 0 when the operands are equal. So, using the || operator, we can sort first by Last Name, then First Name, then Score.

In the second example above, @FullSort looks like:

( [Bubba, brutalski, 10], [Bubba, brutalski, 20], [Jethro, brutalski, 20], [JoeBob, brutalski, 20], [Junior, brutalski, 20] )
because it is sorted by Last Name, then First Name, then Score.

Russ

Answer: How to sort array by columns maintaining the rows? (for C style arrays)
contributed by QandAEditors

the following code shows how to sort this data structure by any of its three columns.

@data = ( [qw(marek brutalski 20)], [qw(zenia markownikowa 10)], [qw(teresa parufkowa 90)], [qw(bogumila pierdawa 40)], [qw(genowefa tempawa 50)], ); # Sort by first name @sorted_by_first = sort { $a->[0] cmp $b->[0] } @data; # Sort by last name @sorted_by_last = sort { $a->[1] cmp $b->[1] } @data; # Sort by score @sorted_by_score = sort { $a->[2] <=> $b->[2] } @data;
notice that the sorts on columns 0 and 1, the names, are performed ASCIIbetically, while the sort by number is done numerically.

Please (register and) log in if you wish to add an answer



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • Outside of code tags, you may need to use entities for some characters:
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others wandering the Monastery: (6)
    As of 2014-09-01 15:48 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      My favorite cookbook is:










      Results (15 votes), past polls