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
(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)
| [reply] [d/l] |
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;
| [reply] [d/l] [select] |
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
| [reply] [d/l] |
|
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 | [reply] [d/l] |
|
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
| [reply] [d/l] [select] |
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
| [reply] [d/l] |
|
|