[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