📜  Perl中的哈希排序

📅  最后修改于: 2022-05-13 01:55:20.838000             🧑  作者: Mango

# Perl中的哈希排序

``````# Perl program to demonstrate
# the concept of hash
use strict;
use warnings;
use 5.010;

# Creating a hash of studentnames
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 30,
Plato => 39,
);

# displaying the keys and values of Hash
# using the foreach loop and keys function
# output may be different each
# time when you run the code
foreach my \$name (keys %studentnames) {

# printing the keys and values of hash
printf "%-8s %s\n", \$name, \$studentnames{\$name};
}
``````

``````Marty    16.5
Jason    25.2
Plato    39
Vivek    27
Socrates 29.5
Martha   14
Earl     31
Uri      19.6
Nitin    30
``````

• 根据其键的 ASCII 值对 Hash 进行排序：通常，排序是基于 ASCII 表。这意味着排序会将所有大写字母保持在所有小写字母的前面。这是排序的默认行为。上面的示例代码是根据其键的 ASCII 值排序的。
• 根据其键的字母顺序对 Hash 进行排序：这里，键是按字母顺序排序的。

例子：

``````# Perl program to demonstrate
# sorting of the hash according
# alphabetical order of its keys
use strict;
use warnings;
use 5.010;

# Creating a hash of studentnames
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 30,
Plato => 39,
);

# sorting the hash according
# alphabetical order of its keys
foreach my \$name (sort {lc \$a cmp lc \$b} keys %studentnames)
{
printf "%-8s %s\n", \$name, \$studentnames{\$name};
}
``````

输出：

``````Earl     31
Jason    25.2
Martha   14
Marty    16.5
Nitin    30
Plato    39
Socrates 29.5
Uri      19.6
Vivek    27
``````
• 根据哈希值排序您也可以根据哈希值对哈希值进行排序，如下所示：

示例 1：根据 ASCII 表对哈希值进行排序。

``````# Perl program to demonstrate
# sorting of the hash according
# to the values of Hash
use strict;
use warnings;
use 5.010;

# Creating a hash of studentnames
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 30,
Plato => 39,
);

# sorting of the hash according
# to ASCII code of values of Hash
foreach my \$name (sort values %studentnames)
{
say \$name;
}
``````

输出：

``````14
16.5
19.6
25.2
27
29.5
30
31
39
``````

示例2：按照Hash的Values的数值排序如下：

``````# Perl program to demonstrate
# sorting of the hash according
# to the values of Hash
use strict;
use warnings;
use 5.010;

# Creating a hash of studentnames
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 30,
Plato => 39,
);

# sorting of the hash according
# to the numerical value of
# Values of hash
foreach my \$name (sort {\$a<=>\$b} values %studentnames)
{
say \$name;
}
``````

输出：

``````14
16.5
19.6
25.2
27
29.5
30
31
39
``````
• 根据值对哈希的键进行排序：您还可以根据给定的值对哈希的键进行排序。

示例 1：在下面的程序中，<=> 被称为spaceship 运算符 。如果您将一次又一次地运行代码，那么您会注意到输出的差异。有时你会在Nitin之前找到柏拉图，反之亦然。

``````# Perl program to demonstrate the
# Sorting of keys of the hash
# according to the values
use strict;
use warnings;
use 5.010;

# Creating a hash of studentnames
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 45,
Plato => 45,
);

# Sort the keys of the hash
# according to the values
# Here \$a and \$b are the
# placeholder variable of sort
foreach my \$name (sort {\$studentnames{\$a} <=>
\$studentnames{\$b}} keys %studentnames)
{
printf "%-8s %s\n", \$name, \$studentnames{\$name};
}
``````

输出：

``````Martha   14
Marty    16.5
Uri      19.6
Jason    25.2
Vivek    27
Socrates 29.5
Earl     31
Plato    45
Nitin    45
``````

例2：为解决上述代码，具有相同值的键可以根据ASCII表排序如下：

``````# Perl program to demonstrate the
# Sorting of keys of the hash
# according to the values
use strict;
use warnings;
use 5.010;

# Creating a hash of studentnames
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 45,
Plato => 45,
);

# keys that have the same value
# will be sorted according the
# ASCII table
foreach my \$name (sort { \$studentnames{\$a} <=> \$studentnames{\$b} or
\$a cmp \$b } keys %studentnames) {
printf "%-8s %s\n", \$name, \$studentnames{\$name};
}
``````

输出：

``````Martha   14
Marty    16.5
Uri      19.6
Jason    25.2
Vivek    27
Socrates 29.5
Earl     31
Nitin    45
Plato    45
``````

说明：这里可以看到键NitinPlato是按照 ASCII 表排序的。无论您运行代码多少次，输出都将保持不变。