Perl:如何向多维数组中的每一行添加额外的列

如何解决Perl:如何向多维数组中的每一行添加额外的列

我有两个多维数组:array1(@wipr) 和 array2(@widesc)

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
  
# Initializing and defining the array
my @wipr = ( ['1111','2221'],['1112','2222'],['1113','2223'],['1115','2225'],'2224'] );
my @widesc = ( ['1111','Bug1'],'Feature1'],'Feature2'],['1114','Feature2'] );
# Printing items from the array
#print Dumper(\@wipr);
#print Dumper(\@widesc);

# Using For loop
for(my $m = 0; $m <= $#wipr; $m++)
{   
   for(my $n = 0; $n <= $#widesc ; $n++)
   {  
      #print $wipr[$m][0],"\n";
      #print $widesc[$n][0];
      if ( "$wipr[$m][0]" == "$widesc[$n][0]" )
      {
          print "Matches: $wipr[$m][0] == $widesc[$n][0]";
          my $desc="$widesc[$n][1]";
          print "desc value is : $desc";
          #push(@{$wipr[$m][1][$m]},"$desc");
          #print "$wipr[$m][1][$m]";
          $wipr[$m][1][$m] = "'$desc'";
          #push (@wipr,$wipr[$m][1][$m]);
      }
      #else
      #{
        #  print "Doesn't Matches: $wipr[$m][0] == $widesc[$n][0]";
      #}
   }  
   print "\n";  
} 
print Dumper(\@wipr);

如果array1(@wipr)中第一列的值与array2(@widesc)中第一列的值匹配,我们需要将array2的第二个元素添加到array1中。 如果值不匹配,它应该只输入一个字符串“未找到”

所需的输出应该是:

 my @result= ( ['1111','2221','2222','2223','2225','Not Found'],'2224','Feature2'] );

我在 array1 中添加第三列时遇到了困难。你能帮忙吗。

错误:不能使用字符串(“2221”)作为数组引用,而在 arrays1.pl line33 中使用“strict refs”。

解决方法

天真的方法:

my @result;
for my $wipr (@wiprs)
   my $wi1 = $wipr->[0];

   for my $widesc (@widescs)
      my $wi2 = $widesc->[0];
      if ($wi1 == $wi2) {
         push @result,[ $wi1,$wipr->@[1..$#$wipr],$widesc->@[1..$#$widesc] ];
         last;
      }
   }
}

这很慢。如果有N个WI,则内循环执行N*N/2次。这意味着花费的时间与 N2 的平方成正比。

当某件事占用资源(例如时间)与 N2 的平方成正比时,我们说它是 O(N2)。


上述速度如此缓慢的原因是匹配记录的过程。如果数组被排序怎么办?

@wiprs   = sort { $a->[0] <-> $b->[0] } @wiprs;
@widescs = sort { $a->[0] <-> $b->[0] } @widescs;

my $pr_i = 0;
my $desc_i = 0;

my @results;
while ($pr_i < @wiprs && $desc_i < @widescs) {
   my $wipr   = $wiprs[$pr_i];
   my $widesc = $widescs[$desc_i];

   my $wi1 = $wipr->[0];
   my $wi2 = $wipdesc->[0];

   my $cmp = $wi1 <=> $wi2;
   if ($cmp < 0) {
      ++$pr_i;
   }
   elsif ($cmp > 0) {
      ++$desc_i;
   }
   else {
      push @result,$widesc->@[1..$#$widesc] ];
      ++$pr_i;
      ++$desc_i;
   }
}

这是 O(N log N)。这是很多更好。

如果我们假设有两个数组都具有相同的 WI,则上述简化为:

die "Bad data\n" if @wiprs != @widescs;

@wiprs   = sort { $a->[0] <-> $b->[0] } @wiprs;
@widescs = sort { $a->[0] <-> $b->[0] } @widescs;

my $pr_i = 0;
my $desc_i = 0;

my @results;
while ($pr_i < @wiprs && $desc_i < @widescs) {
   my $wipr   = $wiprs[$pr_i];
   my $widesc = $widescs[$desc_i];

   my $wi1 = $wipr->[0];
   my $wi2 = $wipdesc->[0];

   die "Bad data\n" if $wi1 != $wi2;

   push @result,$widesc->@[1..$#$widesc] ];
   ++$pr_i;
   ++$desc_i;
}

当然,如果数组已经排序,则简化为以下 O(N) 解决方案:

die "Bad data\n" if @wiprs != @widescs;

my $pr_i = 0;
my $desc_i = 0;

my @results;
while ($pr_i < @wiprs && $desc_i < @widescs) {
   my $wipr   = $wiprs[$pr_i];
   my $widesc = $widescs[$desc_i];

   my $wi1 = $wipr->[0];
   my $wi2 = $wipdesc->[0];

   die "Bad data\n" if $wi1 != $wi2;

   push @result,$widesc->@[1..$#$widesc] ];
   ++$pr_i;
   ++$desc_i;
}

最后,我们通过首先构建索引得到了一个没有上述假设的 O(N) 解决方案。

my %widescs_lookup;
for my $widesc (@widescs)
   my $wi = $widesc->[0];
   $widescs_lookup{$wi} = $widesc;
}

my @results;
for my $wipr (@wiprs)
   my $wi = $wipr->[0];

   my $wi_desc = $widescs_lookup{$wi}
      or next;

   push @result,$widesc->@[1..$#$widesc] ];
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-