在具有Perl值的散列中查找第一个键值对

时间:2017-05-31 08:03:43

标签: perl hash

我有哈希。

        '20111124' => undef,
        '20111125' => undef,
        '20111129' => undef,
        '20111130' => '126002',
        '20111201' => '126002',
        '20111202' => '126002',
        '20111205' => '126002',
        '20111206' => '126002',
        '20111207' => '126002'

我想获得第一个有价值的密钥。

我已经尝试过迭代哈希,但由于哈希有时很大,获得第一个具有定义值的密钥的最快方法是什么?

3 个答案:

答案 0 :(得分:5)

没有"第一关键"在哈希中,因为哈希不是有序的。如果我正确理解您的问题,您需要按字典顺序排列的键。最好的解决方案可能是首先过滤掉具有undef值的键,然后对剩余的键进行排序。这是一项代价高昂的操作,但我认为没有简单的方法。假设您的散列名为%h,此代码可以解决问题:

my @sorted_keys = sort(grep(defined($h{$_}), keys(%h)))
my $first_key = $sorted_keys[0]

答案 1 :(得分:3)

由于速度是主要考虑因素,因此完全执行sort是浪费的:当需要的所有内容都是最小值时,它会对整个列表进行排序。从minstr调用List::Util只需要一次传递值就可以快得多:如果你愿意的话,冒泡排序的第一次迭代。

use strict;
use warnings 'all';
use feature 'say';

use List::Util 'minstr';

my %dates = (
    '20111124' => undef,
    '20111125' => undef,
    '20111129' => undef,
    '20111130' => '126002',
    '20111201' => '126002',
    '20111202' => '126002',
    '20111205' => '126002',
    '20111206' => '126002',
    '20111207' => '126002',
);

my $first = minstr grep { defined $dates{$_} } keys %dates;

say $first;

输出

20111130

您也可以在Perl中单次传递哈希

my $first;
for my $date ( keys %dates ) {
    if ( defined $dates{$date} ) {
        $first = $date unless defined $first and $first le $date;
    }
}

这可能会更快,因为它不涉及创建具有已定义值的中间键列表,但此处有很多Perl代码,而minstrgrep是对C代码的调用。我目前无法对这两者进行基准测试;也许其他人想要这个练习?

答案 2 :(得分:0)

self.yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
self.yourTextView.scrollRectToVisible(rect, animated: false)
self.yourTextView.isScrollEnabled = true