В Perl, как я могу напечатать ключ, соответствующий максимальному значению в хэше? - PullRequest
0 голосов
/ 17 ноября 2011

Как я могу напечатать только первый ключ и элемент моего хэша?

У меня уже есть отсортированный хеш, но я хочу напечатать только первый ключ и соответствующее значение спасибо,

Спасибо всем вам в конце, я нажимаю ключи и значения на два разных элемента @array и print 0 каждого массива, и это работает :)

Ответы [ 5 ]

8 голосов
/ 17 ноября 2011

Хэши имеют неупорядоченные ключи.Таким образом, в хэше нет такого ключа как первый ключ .

Однако, если вам нужен ключ, который сортирует первым (для максимального значения ключа):

my %hash = (
    'foo' => 'bar',
    'qux' => 'baz',
);

my ($key) = sort { $b cmp $a } keys %hash;
print "$key => $hash{$key}";  # Outputs: qux => baz

Не забудьте использовать <=> вместо cmp для числовой сортировки.

5 голосов
/ 17 ноября 2011

В хешах perl нет порядка для ключей. Используйте функцию sort , чтобы получить ключи в нужном вам порядке, или вы можете вставить ключи в массив при создании хэша, и ваш первый ключ будет иметь нулевой индекс в массиве

Вы можете использовать приведенный ниже код, я предполагаю, что имя хэша - my_hash, а ключи и значения - числа. Если у вас есть строки, вы можете использовать cmp вместо <=>. Обратитесь к документации сортировки для получения более подробной информации

Получить ключ макс.

foreach (sort {$b <=> $a} keys %my_hash) {
    print "Keys is $_\n";
    print "Value is $my_hash{$_}\n";
    last;
}

Получить ключ, соответствующий максимальному значению

foreach (sort {$my_hash{$b} <=> $my_hash{$a}} keys %my_hash) {
    print "Keys is $_\n";
    print "Value is $my_hash{$_}\n";
    last;
}
0 голосов
/ 17 ноября 2011

Для больших хэшей, если вам не нужны отсортированные ключи по какой-либо другой причине, может быть лучше избежать сортировки.

#!/usr/bin/env perl

use strict; use warnings;

my %hash = map { $_ => rand(10_000) } 'aa' .. 'zz';

my ($argmax, $max) = each %hash;
keys %hash; # reset iterator

while (my ($k, $v) = each %hash) {
    if ($v >= $max) {
        $max = $v;
        $argmax = $k;
    }
}

print "$argmax => $max\n";

Если вы хотите сортировать, вам нужен только ключ с максимальным значением, а не все массивы keys и values:

#!/usr/bin/env perl

use strict; use warnings;

my %hash = map { $_ => rand(10_000) } 'aa' .. 'zz';
my ($argmax) = sort { $hash{$b} <=> $hash{$a} } keys %hash;

print "$argmax => $hash{$argmax}\n";
0 голосов
/ 17 ноября 2011
foreach my $key (sort keys(%hash)) { 
   print "$key" .  "$hash{$key}" . "\n"; 
   last;
} 
0 голосов
/ 17 ноября 2011

Точно так же, как писал Алан, хэши не имеют определенного порядка, но вы можете сортировать ключи хешей:

foreach my $key (sort keys(%hash)) {
   print $key . ': ' . $hash{$key} . "\n";
}

или, как вы хотите, получить первый элемент из массива ключей:

my @keys = keys(%hash);
print $keys[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...