首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用foreach循环对两个散列数组进行比较

如何使用foreach循环对两个散列数组进行比较
EN

Stack Overflow用户
提问于 2018-10-25 03:51:06
回答 1查看 194关注 0票数 0

我需要使用foreach循环来比较两个哈希数组。但我真的不知道该怎么做。

我的原始数据:

代码语言:javascript
复制
NewData(file 1)
Puma
77777 33333 44444 55555 
Adidas
99999 88888 55555 77777 
22222 11111 33333 44444
Brooks
11111 22222 33333 44444 
33333 44444 55555 66666 

OldData(file 2)

Puma
77777 33333 44444 55555 
Adidas
11111 11111 33333 44444 
99999 88888 55555 77777 
Brooks
11111 22222 33333 44444 
33333 44444 55555 66666 

我的hash1:

代码语言:javascript
复制
'Adidas' => {
                        'y1' => [
                                  '88888',
                                  '11111'
                                ],
                        'x2' => [
                                  '55555',
                                  '33333'
                                ],
                        'y2' => [
                                  '77777',
                                  '44444'
                                ],
                        'x1' => [
                                  '99999',
                                  '22222'
                                ]
                      },
          'Puma' => {
                      'y1' => [
                                '33333'
                              ],
                      'x2' => [
                                '44444'
                              ],
                      'y2' => [
                                '55555'
                              ],
                      'x1' => [
                                '77777'
                              ]
                    },
 'Brooks' => {
                        'y1' => [
                                  '22222',
                                  '44444'
                                ],
                        'x2' => [
                                  '33333',
                                  '55555'
                                ],
                        'y2' => [
                                  '44444',
                                  '66666'
                                ],
                        'x1' => [
                                  '11111',
                                  '33333'
                                ]
                      }


 };

我的hash2:

代码语言:javascript
复制
$VAR1 = {
          'Adidas' => {
                        'y1' => [
                                  '11111',
                                  '88888'
                                ],
                        'x2' => [
                                  '33333',
                                  '55555'
                                ],
                        'y2' => [
                                  '44444',
                                  '77777'
                                ],
                        'x1' => [
                                  '11111',
                                  '99999'
                                ]
                      },
          'Puma' => {
                      'y1' => [
                                '33333'
                              ],
                      'x2' => [
                                '44444'
                              ],
                      'y2' => [
                                '55555'
                              ],
                      'x1' => [
                                '77777'
                              ]
                    },
 'Brooks' => {
                        'y1' => [
                                  '22222',
                                  '44444'
                                ],
                        'x2' => [
                                  '33333',
                                  '55555'
                                ],
                        'y2' => [
                                  '44444',
                                  '66666'
                                ],
                        'x1' => [
                                  '11111',
                                  '33333'
                                ]
                      }
        };

我的匹配和非匹配尝试代码:

代码语言:javascript
复制
 foreach my $newq (keys %hash1)
    {
         foreach my $oldq(keys %hash2)
         {
         if ( $newq eq $oldq)
         {
         foreach my $newx1(@{$hash1{$newq}{x1}})
         {
         foreach my $oldx1(@{$hash2{$oldq}{x1}})
         {
         if ($newx1 == $oldx1)
         {
         print "$newq\t$newx1\t$oldx1\n";
         }
         if ($newx1 != $oldx1)
         {
         print "$newq\t$newx1\t$oldx1\n";
         }
             }

我的匹配输出

代码语言:javascript
复制
         New     Old
Adidas  99999   99999
Puma    77777   77777
Brooks  11111   11111
Brooks  33333   33333

我的不匹配输出:

代码语言:javascript
复制
        New     Old
Adidas  99999   11111
Adidas  22222   11111
Adidas  22222   99999
Brooks  11111   33333
Brooks  33333   11111

用于匹配的期望输出:

代码语言:javascript
复制
                      New                           Old
Puma                77777 33333 44444 55555     77777 33333 44444 55555
Adidas              99999 88888 55555 77777     99999 88888 55555 77777
Brooks              11111 22222 33333 44444     11111 22222 33333 44444
Brooks              33333 44444 55555 66666     33333 44444 55555 66666


Not matching

Adidas              22222 11111 33333 44444     11111 11111 33333 44444

现在,我可以得到x1的正确匹配。但是我得到了“不匹配”的错误输出。我对“非匹配”的预期输出是Adidas 22222 11111,因为'x1=> 99999'同时出现在新数据和旧数据中。我不知道如何继续“y1,x2,And y2”.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-25 09:01:51

x1,y1等.只是散列中的键,所以您可以像获取这些键一样得到像下面这样的散列。

代码语言:javascript
复制
keys %{$hash1{$newq}}

你不需要让你的代码像你一样复杂,尽管有那么多的循环层。以这部分为例..。

代码语言:javascript
复制
foreach my $newq (keys %hash1)
{
     foreach my $oldq(keys %hash2)
     {
         if ( $newq eq $oldq)
         {
             # ....
         }
     }
 }

您不需要循环两个散列,因为您可以测试其他散列中是否存在一个键。想象一下,如果您的哈希每个有100个键。您的代码当前检查%hash2中的所有100个键和%hash1中的每个键,然后再执行一次,因此进行了20000次测试。如果你像这样写代码..。

代码语言:javascript
复制
foreach my $newq (keys %hash1)
{
    if(defined($hash2{$newq}))
    {
        # both hashes have this key
    }
    else
    {
        # %hash2 doesn't have the key
    }
}

foreach my $newq (keys %hash2)
{
    if(!defined($hash1{$newq}))
    {
        # %hash1 doesn't have the key
    }
    else
    {
        # They both do, but we already know that from the first loop
    }
}

...it只需要检查两个散列中的每个键一次,所以只需要检查200个。

因此,最终完成的代码可能是:

代码语言:javascript
复制
my %nonmatching;
print "Matching\n";
foreach my $outerkey (keys %hash1)
{
    if(defined($hash2{$outerkey}))
    {
        foreach my $innerkey (keys %{$hash1{$outerkey}})
        {
            if(join(" ",sort @{$hash1{$outerkey}{$innerkey}}) eq join(" ",sort @{$hash2{$outerkey}{$innerkey}}))
            {
                 printf "%-20s %30s %30s\n",$outerkey, join(" ",@{$hash1{$outerkey}{$innerkey}}), join(" ",@{$hash2{$outerkey}{$innerkey}});
            } 
            else
            {
                 $nonmatching{$outerkey}{$innerkey}=1;
            }
        }
    }
    else
    {
        foreach my $innerkey (keys %{$hash1{$outerkey}})
        {
            $nonmatching{$outerkey}{$innerkey}=1;
        }
    }
}

foreach my $outerkey (keys %hash2)
{
    if(!defined($hash1{$outerkey}))
    {
        foreach my $innerkey (keys %{$hash2{$outerkey}})
        {
            $nonmatching{$outerkey}{$innerkey}=1;
        }
    }
}

print "Nonmatching\n";
foreach my $outerkey (keys %nonmatching)
{
    foreach my $innerkey (keys %{$nonmatching{$outerkey}})
    {
         printf "%-20s %30s %30s\n",$outerkey, join(" ",@{$hash1{$outerkey}{$innerkey}}), join(" ",@{$hash2{$outerkey}{$innerkey}});
    }
}

尽管您声明的散列与源数据不匹配,所以输出看起来不像您所期望的那样。我本以为您的散列看起来会更像下面的片段,所以您的文件读取代码可能也不像您想要的那样工作?

代码语言:javascript
复制
'Adidas' => {
   'x1' => [
       '99999','88888','55555','77777'
    ]
  };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52981097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档