Arrays Perl—标识哈希中具有最高值的所有元素
我编写了一些Perl代码,在散列中搜索最高的键值对,其中键是文本,值是数字:Arrays Perl—标识哈希中具有最高值的所有元素,arrays,perl,hash,Arrays,Perl,Hash,我编写了一些Perl代码,在散列中搜索最高的键值对,其中键是文本,值是数字: my $o_val = 0; # FOR TRACKING HIGHEST VALUE ENCOUNTERED IN THE LOOP my $o_key; # FOR TRACKING CORRESPONDING KEY TO THE HIGHEST VALUE while ( my ($key, $val) = each(%NG) ) { if ( $val > $o_va
my $o_val = 0; # FOR TRACKING HIGHEST VALUE ENCOUNTERED IN THE LOOP
my $o_key; # FOR TRACKING CORRESPONDING KEY TO THE HIGHEST VALUE
while ( my ($key, $val) = each(%NG) ) {
if ( $val > $o_val ) {
$o_val = $val;
$o_key = $key;
}
}
print "$okey\n";
问题是,它并没有考虑到最高价值出现平局的可能性如果我的测量变量可能随循环的每次迭代而变化,我如何捕获所有与最高值相关的键值对?
我的想法是,我可以编写另一个while循环,在$o_val被确定为最高值后,通过相同的散列运行,然后将与$o_val成对的每个键推送到另一个数组中,类似于:
my @highest; # ARRAY OF HIGHEST-VALUE KEYS
while ( my ($key, $val) = each(%NG) ) {
if ( $val == $o_val ) { push(@highest, $key); }
}
my %v;
push @{ $v{$h{$_}} }, $_ for keys %h;
my ($max) = sort { $b <=> $a } keys %v;
print "@{ $v{$max} } => $max\n"
但这似乎有点低效。我希望有一些我不知道的Perl命令可以让我识别散列中的最高值,而无需循环,这样我就可以使用问题中的第二段代码 您可以使用数组来保留最高值的键
if ( $val > $o_val ) {
$o_val = $val;
@o_keys = $key;
}
elsif ($val == $o_val) {
push(@o_keys, $key);
}
您可以使用数组将键保留为最大值
if ( $val > $o_val ) {
$o_val = $val;
@o_keys = $key;
}
elsif ($val == $o_val) {
push(@o_keys, $key);
}
#/usr/bin/env perl
严格使用;
使用警告;
我的%h=map{$\uz=>int(rand 10)}'a''z′;
#看看我们有什么
my@k=sort{$h{$b}$h{$a}}键%h;
为@k打印“$\=>$h{$\}\n”;
#使用%h中的值初始化$max
my($max)=值%h;
#具有最高值的键
我的@argmax;
而(我的($k,$v)=每%h){
下一步,如果$v<$max;
如果($v>$max){
$max=$v;
@argmax=(千美元);
}
否则{
推送@argmax,$k
}
}
打印“@argmax\n”;
打印“@h{@argmax}\n”;
当然,如果你不太在意记忆,或者你在打高尔夫球,或者在玩日本游戏,你可以写一些类似的东西:
my @highest; # ARRAY OF HIGHEST-VALUE KEYS
while ( my ($key, $val) = each(%NG) ) {
if ( $val == $o_val ) { push(@highest, $key); }
}
my %v;
push @{ $v{$h{$_}} }, $_ for keys %h;
my ($max) = sort { $b <=> $a } keys %v;
print "@{ $v{$max} } => $max\n"
my%v;
按@{$v{$h{${}},$}键%h;
my($max)=排序{$b$a}键%v;
打印“@{$v{$max}=>$max\n”
#/usr/bin/env perl
严格使用;
使用警告;
我的%h=map{$\uz=>int(rand 10)}'a''z′;
#看看我们有什么
my@k=sort{$h{$b}$h{$a}}键%h;
为@k打印“$\=>$h{$\}\n”;
#使用%h中的值初始化$max
my($max)=值%h;
#具有最高值的键
我的@argmax;
而(我的($k,$v)=每%h){
下一步,如果$v<$max;
如果($v>$max){
$max=$v;
@argmax=(千美元);
}
否则{
推送@argmax,$k
}
}
打印“@argmax\n”;
打印“@h{@argmax}\n”;
当然,如果你不太在意记忆,或者你在打高尔夫球,或者在玩日本游戏,你可以写一些类似的东西:
my @highest; # ARRAY OF HIGHEST-VALUE KEYS
while ( my ($key, $val) = each(%NG) ) {
if ( $val == $o_val ) { push(@highest, $key); }
}
my %v;
push @{ $v{$h{$_}} }, $_ for keys %h;
my ($max) = sort { $b <=> $a } keys %v;
print "@{ $v{$max} } => $max\n"
my%v;
按@{$v{$h{${}},$}键%h;
my($max)=排序{$b$a}键%v;
打印“@{$v{$max}=>$max\n”
在读到你的答案之前,我根本不知道什么是高尔夫或日本式运动。你为我打开了一个全新的世界,在我读到你的答案之前,我根本不知道什么是高尔夫或日本式运动。你为我打开了一个全新的世界。