【问题标题】:Can a Hash have duplicate keys or values哈希可以有重复的键或值吗
【发布时间】:2011-09-01 09:51:10
【问题描述】:

哈希可以有重复的键或值吗?

【问题讨论】:

  • 你说的是哈希表吗?
  • 哦,没有意识到 hash 是 Perl 的关联数组名称(奇怪)。
  • @Jake T.,Perl 关联数组是哈希表
  • @Jake T => 我写了一个关于名称hash 的评论,它是“hash table”的缩写,是“用hashing 实现的数据结构”的缩写用于将任意字符串映射到存储桶数组的索引的函数,每个存储桶包含一个键值对的短链表,使用字符串比较与请求的键进行比较。如果链表足够长,则存储桶数组被扩展,字符串和索引之间的对应映射被更新,数据被重新洗牌。最优解决方案将努力将这种影响最小化。
  • @Jake T.,所以?鉴于加密哈希既没有键也没有值,因此 OP 的请求没有混淆。此外,上下文是 Perl 特定的。

标签: perl hash


【解决方案1】:

它可以有重复的值,但不能有键。

【讨论】:

    【解决方案2】:

    对于散列和数组,给定键只能存储一个标量。 (“键是唯一的。”)如果不是,你就不能这样做

    $h{a} = 1;
    $h{a} = 2;
    $val = $h{a};  # 2
    
    $a[4] = 1;
    $a[4] = 2;
    $val = $a[4];  # 2
    

    如果您想将多个值与一个键关联,您可以在该键处放置对数组(或哈希)的引用,并将值添加到该数组(或哈希)中。

    for my $n (4,5,6,10) {
        if ($n % 2) {
            push @{ $nums{odd} }, $n;
        } else {
            push @{ $nums{even} }, $n;
        }
    }
    
    say join ', ', @{ $nums{even} };
    

    请参阅perllol 了解更多信息。

    对于值,多个元素可以在哈希和数组中具有相同的值。

    $counts{a} = 3;
    $counts{b} = 3;
    
    $counts[5] = 3;
    $counts[6] = 3;
    

    【讨论】:

      【解决方案3】:

      假设谈论“%hash”

      然后:

      • 不允许重复键。
      • 允许重复值。

      这很容易推理,因为它是 particular 键到 particular 值的映射,其中该值不参与查找,因此独立于其他价值观。

      【讨论】:

        【解决方案4】:

        请尝试运行此代码,它执行时没有错误。 我希望这就是你要问的!

        #!/usr/bin/perl
        
        use strict;
        use warnings;
        
        my %hash = ('a' => 1, 'a' => 2, 'b' => 4 );
        
        print values %hash, "\n\n";
        print keys %hash, "\n\n";
        

        【讨论】:

          【解决方案5】:

          您可以尝试使用 CPAN 中的Hash::MultiKey 模块。

          (我使用 Data::Dumper 来展示哈希的外观 - 这里没有必要)

          use Data::Dumper;
          use Hash::MultiKey;
          
          tie my %multi_hash, 'Hash::MultiKey';
          
          $multi_hash{['foo', 'foo', 'baz']} = "some_data";
          
          for (keys %multi_hash) {
              print @$_,"\n";
          };
          
          print Dumper\%multi_hash;
          

          输出应该是 () :

          foofoobaz
          $VAR1 = {
                    'ARRAY(0x98b6978)' => 'some_data'
                  };
          

          所以从技术上讲 Hash::MultiKey 让您可以将引用创建为哈希键。

          【讨论】:

            【解决方案6】:

            是的,哈希可以有重复的键,如下所示...

            关键示例:BirthDate|LastNameFirst4Chars|FirstNameInitial|IncNbr “1959-12-19|威尔|K|1” ... “1959-12-19|威尔|K|74”。
            注意:如果有人不记得他们的社会保障号,这可能是用于查找记录的有用密钥

               #-- CODE SNIPPET:
               @Offsets=();     #-- we will build an array of Flat File record "byte offsets" to random access
                                #-- for all records matching this ALT KEY with DUPS       
               for ($i=1; $i<=99; $i++) {
                   $KEY=$BirthDate . "|" . $LastNameFirst4Chars . "|" . $FirstNameInitial . "|" . $i; 
                   if (exists $Hash{$KEY}) {
                       push @Offsets, $Hash{$KEY};  #-- add another hash VALUE to the end of the array
                   }
               } 
            

            【讨论】:

            • 这说明了什么?代码运行后,@Offsets%Hash 都没有改变(即仍然为空)。该代码只是为变量$KEY 生成99 个不同的 值,例如blabla|1blabla|2、...blabla|99
            • 好的,但是 Perl 中的标准哈希绝对不能有重复的键。您示例中的键都不同。 "$BirthDate|...|1""$BirthDate|...|2" 不同,不是吗?所以键是重复的。
            • PerlDuck,序列号使密钥唯一。如果我有一个唯一的主键,让我们说社会安全号码。我想访问我的数据库中的一条记录,但不记得 SSN,然后我可以使用带有 DUPS 的 ALT KEY,例如:“$BirthDate|$LastNameFirst4Chars|$FirstNameInitial|SeqNbr”。 "1959-12-19|Will|K|1 ... "1959-12-19|Will|K|99"。除了序列 nbr 之外,KEY 中的所有数据都是重复的。这就是启用哈希的方式拥有重复的钥匙。
            猜你喜欢
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 2014-11-09
            • 1970-01-01
            • 1970-01-01
            • 2019-03-19
            • 2021-11-03
            • 2018-06-18
            相关资源
            最近更新 更多