在 Perl 中对散列进行排序
先决条件: Perl | Hashes
一组键/值对被称为哈希。哈希结构中的每个键都是唯一的,并且是类型字符串。与这些键相关联的值是标量。这些值可以是数字、字符串或引用。哈希是用我的关键字声明的。让我们考虑一个例子来理解散列排序的概念。
例子:考虑一个班级学生名字和他们平均分数的散列。这里,学生的名字是关键,他们的平均成绩是数值。使用keys
函数返回的学生姓名上的 foreach 循环打印该散列。
# 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
注意:输出可能包含任何随机顺序,具体取决于系统和 Perl 的版本。
哈希可以通过如下多种方式排序:
- 根据哈希键的 ASCII 值对哈希进行排序:一般来说,排序是基于 ASCII 表的。这意味着排序会将所有大写字母放在所有小写字母的前面。这是排序的默认行为。上面的示例代码是根据其键的 ASCII 值排序的。
-
Sorting the Hash according to the alphabetical order of its keys: Here, the keys are sorted alphabetically.
示例:
```perl
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}; } ```
输出:
```perl Earl 31 Jason 25.2 Martha 14 Marty 16.5 Nitin 30 Plato 39 Socrates 29.5 Uri 19.6 Vivek 27
```
-
Sorting according to the values of Hash: You can also sort the hash according to the values of hash as follows:
示例 1: 根据 ASCII 表对哈希值进行排序。
```perl
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; } ```
输出:
```perl 14 16.5 19.6 25.2 27 29.5 30 31 39
```
例 2: 根据哈希值的数值排序如下:
```perl
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; } ```
输出:
```perl 14 16.5 19.6 25.2 27 29.5 30 31 39
```
-
Sort the keys of the hash according to the values: You can also sort the keys of hash according to the given values.
示例 1: 在下面的程序中,< = >被称为宇宙飞船操作员。如果您反复运行代码,那么您可以注意到输出中的差异。有时你会在之前找到柏拉图,反之亦然。
```perl
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}; } ```
输出:
```perl 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
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}; } ```
输出:
```perl Martha 14 Marty 16.5 Uri 19.6 Jason 25.2 Vivek 27 Socrates 29.5 Earl 31 Nitin 45 Plato 45
```
说明:这里可以看到重点尼廷和柏拉图是按照 ASCII 表排序的。不管您运行代码多少次,输出都将保持不变。