in reply to
Re^3: sort hash of arrays of arrays
in thread sort hash of arrays of arrays
I'd like to sort the outer arrays of each hash item (1-4) separately, based on the second item of the inner arrays to finally have something like:
{
1 => [
[26, 27, 28],
[16, 17, 18],
[6, 7, 8],
[1, 2, 3]
],
2 => [
[27, 28, 29],
[17, 18, 19],
[7, 8, 9],
[2, 3, 4],
],
3 => [
[28, 29, 30],
[18, 19, 20],
[8, 9, 10],
[3, 4, 5]
],
4 => [
[29, 30, 31],
[19, 20, 21],
[9, 10, 11],
[4, 5, 6]
],
}
So for the first set, values 2, 7, 17 and 27 were compared to get the right order.
I hope this clarifies my problem.
Thanks
Re^5: sort hash of arrays of arrays by BrowserUk (Pope) on Oct 31, 2012 at 16:05 UTC |
@{ $hash{$_} } = sort{ $b->[1] <=> $a->[1] } @{ $hash{$_} } for keys %
+hash;;
pp \%hash;;
{
1 => [[26, 27, 28], [16, 17, 18], [6, 7, 8], [1, 2, 3]],
2 => [[27, 28, 29], [17, 18, 19], [7, 8, 9], [2, 3, 4]],
3 => [[28, 29, 30], [18, 19, 20], [8, 9, 10], [3, 4, 5]],
4 => [[29, 30, 31], [19, 20, 21], [9, 10, 11], [4, 5, 6]],
}
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
RIP Neil Armstrong
| [reply] [d/l] |
|
It's awesome, thank you!
How does it work? Specifically, why does it need the for keys %hash part? How could I sort on the innermost elements (e.g. [26, 27, 28] to get [28, 27, 26]) using the same method?
Thanks very much.
| [reply] [d/l] [select] |
|
How does it work? Specifically, why does it need the "for keys %hash" part?
Because, as I said, you need to do one sort for each key.
(I don't know how better to explain it than that. )
How could I sort on the innermost elements (e.g. [26, 27, 28] to get [28, 27, 26]) using the same method?
Now you need to do one sort for each sub array, for each key, so you need nested loops:
for my $key ( keys %hash ) {
for my $aref ( @{ $hash{ $key } } ) {
@{ $aref } = sort { $b <=> $a } @{ $aref };
}
}
;;
pp \%hash;;
{
1 => [[28, 27, 26], [18, 17, 16], [8, 7, 6], [3, 2, 1]],
2 => [[29, 28, 27], [19, 18, 17], [9, 8, 7], [4, 3, 2]],
3 => [[30, 29, 28], [20, 19, 18], [10, 9, 8], [5, 4, 3]],
4 => [[31, 30, 29], [21, 20, 19], [11, 10, 9], [6, 5, 4]],
}
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
RIP Neil Armstrong
| [reply] [d/l] [select] |
|
|