[Cologne-pm] Sorting a hash by the hash value
Cem Sakaryali
cem.sakaryali at easi.de
Sun Nov 6 23:47:17 PST 2005
die Quelle ist:
http://www.devdaily.com/perl/edu/qanda/plqa00016/
Gruss
Cem
n Sun, 2005-11-06 at 22:38 +0100, Cem Sakaryali wrote:
> Habe ich im Netzt gefunden, möglicherweise kann
> es für einen von euch Nützlich sein.
>
> Gruss
> Cem
>
> #############################
>
> Answer:
>
> First, sorting a hash by the hash key
>
> Sorting the output of a hash by the hash key is a pretty well-known
> recipe. It's covered in another Q&A article titled "How to sort a hash
> by the hash key".
>
> Sorting a hash by the hash value
>
> Sorting a hash by the hash value is a bit more difficult than sorting
> the hash by the key, but it's not too bad. It just requires a small
> "helper" function.
>
> This is easiest to demonstrate by example. Suppose we have a class of
> five students. Rather than give them names, we'll call them student1,
> student2, etc. Suppose these students just took a test, and we stored
> their grades in a hash (called associative arrays prior to the release
> of Perl 5) named grades.
>
> The hash definition might look like this:
>
> %grades = (
> student1 => 90,
> student2 => 75,
> student3 => 96,
> student4 => 55,
> student5 => 76,
> );
>
> If you're familiar with hashes, you know that the student names are the
> keys, and the test scores are the hash values.
>
> The key to sorting a hash by value is the function you create to help
> the sort command perform it's function. Following the format defined by
> the creators of Perl, you create a function I call a helper function
> that tells Perl how to sort the list it's about to receive. In the case
> of the program you're about to see, I've created two helper functions
> named hashValueDescendingNum (sort by hash value in descending numeric
> order) and hashValueAscendingNum (sort by hash value in ascending
> numeric order).
>
> Here's a program that prints the contents of the grades hash, sorted
> numerically by the hash value:
>
> #!/usr/bin/perl -w
>
> #----------------------------------------------------------------------#
> # printHashByValue.pl
> #
> #
> #
> # Copyright 1998 DevDaily Interactive, Inc. All Rights Reserved.
> #
> #----------------------------------------------------------------------#
>
> #----------------------------------------------------------------------#
> # FUNCTION: hashValueAscendingNum
> #
> #
> #
> # PURPOSE: Help sort a hash by the hash 'value', not the 'key'.
> #
> # Values are returned in ascending numeric order (lowest
> #
> # to highest).
> #
> #----------------------------------------------------------------------#
>
> sub hashValueAscendingNum {
> $grades{$a} <=> $grades{$b};
> }
>
>
> #----------------------------------------------------------------------#
> # FUNCTION: hashValueDescendingNum
> #
> #
> #
> # PURPOSE: Help sort a hash by the hash 'value', not the 'key'.
> #
> # Values are returned in descending numeric order
> #
> # (highest to lowest).
> #
> #----------------------------------------------------------------------#
>
> sub hashValueDescendingNum {
> $grades{$b} <=> $grades{$a};
> }
>
>
> %grades = (
> student1 => 90,
> student2 => 75,
> student3 => 96,
> student4 => 55,
> student5 => 76,
> );
>
> print "\n\tGRADES IN ASCENDING NUMERIC ORDER:\n";
> foreach $key (sort hashValueAscendingNum (keys(%grades))) {
> print "\t\t$grades{$key} \t\t $key\n";
> }
>
> print "\n\tGRADES IN DESCENDING NUMERIC ORDER:\n";
> foreach $key (sort hashValueDescendingNum (keys(%grades))) {
> print "\t\t$grades{$key} \t\t $key\n";
> }
>
>
>
> Although this demo program is fairly lengthy, you can see at the bottom
> of the code where the student grades are printed in ascending and
> descending numeric value.
>
> The output of the program looks like this:
>
> GRADES IN ASCENDING NUMERIC ORDER:
> 55 student4
> 75 student2
> 76 student5
> 90 student1
> 96 student3
>
> GRADES IN DESCENDING NUMERIC ORDER:
> 96 student3
> 90 student1
> 76 student5
> 75 student2
> 55 student4
>
>
> _______________________________________________
> Cologne-pm mailing list
> Cologne-pm at pm.org
> http://mail.pm.org/mailman/listinfo/cologne-pm
More information about the Cologne-pm
mailing list