Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Sorting arrays based on a single element

by sdyates (Scribe)
on May 09, 2003 at 18:44 UTC ( [id://256968]=perlquestion: print w/replies, xml ) Need Help??

sdyates has asked for the wisdom of the Perl Monks concerning the following question:

Well, I have an array @Array(id,day,number). I want to sort based on the second number (day). I have not indexed the array and do not believe I have to, but am perplexed at why I cannot figure out how to do such a simple task. I have doen this before many a time in basic and I think that is getting me in to trouble here in perl

Feel free to point me to a simple help page on this one. I am ashamed to ask for help here


THanks
  • Comment on Sorting arrays based on a single element

Replies are listed 'Best First'.
(jeffa) Re: Sorting arrays based on a single element
by jeffa (Bishop) on May 09, 2003 at 18:51 UTC
    Please provide more context. You say you have an array, but you give the impression that it looks something like: my @array = (1,15,42); and you want to sort by the second number? That makes no sense (you can't sort a single value). However, if your array is really an array of arrays:
    my @array = ([1,15,42], [5,2,36], [10,10,220]); # then you can use print "@$_\n" for sort { $a->[1] <=> $b->[1] } @array; # or @array = sort { $a->[1] <=> $b->[1] } @array;
    And no need for shame. As my old Recording Industry prof used to say, "you are only one button push away". And sometimes it takes another pair of eyes to find that button.

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    
Re: Sorting arrays based on a single element
by kilinrax (Deacon) on May 09, 2003 at 18:51 UTC
    I'm assuming you have something like this:
    # id day number my @array = ( [ 1, 25, 6156 ], [ 2, 13, 5324 ], [ 3, 32, 13617 ] );
    In which case, you want to sort it thusly:
    my @sorted_array = sort { $a->[1] <=> $b->[1] } @array;
Re: Sorting arrays based on a single element
by BrowserUk (Patriarch) on May 09, 2003 at 18:57 UTC

    Never, EVER, EVER be ashamed for asking a question. Absolutley the ONLY dumb question, is the one you didn't ask! (Well. Maybe asking the same question over and over but...:)

    That said, you haven't really given us enough information to understand your problem. I can make a guess at what you are trying to do, but it would be much simpler if you would show us a little real code that would clarify what you mean by @Array(id,day,number). It would allow us to give an answer directed at your problem without having to apply caveats or speculations as to your meaning.


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller
      sub PushDate { $x=0; if (($Date) == $StartDate[2]) { push (@DayAway, $id,$x,$Key) } while ($x < 7) { if (($Date + $x) gt $MaxDays) { $DaysAway = $MaxDays - $Date + $x; # need to see if we are one month ahead!!! } elsif (($Date + $x) == $StartDate[2]) { push (@DayAway, $id,$x,$Key); } $x=$x+1; } }

      It appears the data may not be placed in to the array properly from what I see already. After I have pushed (@DayAway, $id,$x,$Key), I want to sort the array based on $x, it appears I cannot do this now. So, I must sort before placing in to the array unless I want to redo the way I enter the data in to the array. Perhaps I should enter it differently.... hmmmm

        Okay. The problem is, that whilst you are pushing your 3 value onto the array with a single statement, the effect is the same as if you had pushed them each individually. So after you have push two sets of 3 onto the array, you end up with an array that looks like this

        @DayAway => ( id1, x1, key1, id2, x2, key2 );

        In other words, 6 discrete values, with no effective grouping between them. So when you sort the array, you'll be comparing apples with oranges, so to speak.

        Try modifying the push statements so that you are pushing an single entity (an anonymous array) that contains the 3 values each time. E.g.

        push (@DayAway, [$id, $x, $Key] );

        Then the sort strategies offered above will work for you.

        I would suggest that you try dumping the array's contents (see Data::Dumper) before and after you make this change to see the difference it makes, and then review perldsc.

        Hope it helps.


        Examine what is said, not who speaks.
        "Efficiency is intelligent laziness." -David Dunham
        "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller
Re: Sorting arrays based on a single element
by artist (Parson) on May 09, 2003 at 18:56 UTC
    my @data = ( [ 1, 10, 100], [ 2, 34, 300], [ 3, 23, 500] ); @sorted_data = sort { $a->[1] <=> $b->[1] } @data; print $sorted_data[2][2]; __END__ 300

    artist

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://256968]
Approved by broquaint
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-20 01:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found