【问题标题】:deleting elements in array in a loop Perl在循环Perl中删除数组中的元素
【发布时间】:2013-05-04 00:27:18
【问题描述】:

我想创建一个循环,遍历一个数组 (@array1) 中的所有元素,如果在另一个数组 (@array2) 中找到相同的元素,我想要第三个数组 (@array3) 中的值) 将相同的索引添加到第一个数组并从第三个数组中删除。我尝试过这种方式,但是带有 if 语句的行在未初始化的值上运行,并且它永远循环。

    foreach my $elem1 (@array1){
        my $i = 0;
        while ($i < scalar @array2){
            if($array2[$i]==$elem1){
                push (@array1, $array3[$i]);
                delete $array2[$i];
            }
            else{
                $i++;
            }
        }
    }

【问题讨论】:

  • delete 函数主要用于散列,而不是数组。你想要splice。见perldoc.perl.org/functions/delete.html。更一般地说,有更好的方法来解决这个问题。
  • 您下面的 cmets 表明您错误地描述了您想要的算法。请向我们展示您想要什么的清晰示例 - 向我们展示在您执行所需操作之前和之后数组的外观。

标签: arrays perl if-statement


【解决方案1】:

问题是如果元素匹配,你不会增加 $i。删除else

【讨论】:

  • 但是如果我删除了array2的第一个元素,那么必须有一个新的第一个元素,所以$i只有在我不删除元素的情况下才应该增加对吧?
【解决方案2】:

嗯,这是处理问题的一种方法(在我理解您想要做什么的范围内)。每当您需要回答有关成员资格的问题时,您可能需要使用哈希。

use strict;
use warnings;

my @array1 = ( 11, 22, 33,  44);
my @array2 = ( 11,  2,  3,  44,  5,   44);
my @array3 = (-11, -2, -3, -44, -5, -444);

# Keep track of every value in @array1.
my %vals = map { $_ => 1 } @array1;

my @keep_indexes;

# Go through @array2, either adding the corresponding
# value in @array3 to @array1 or storing the array index.
for my $i (0 .. $#array2) {
    if ($vals{$array2[$i]}){
        push @array1, $array3[$i];
    }
    else {
        push @keep_indexes, $i;
    }
}

# Rebuild @array3 from the indexes that we stored.
# Change this to @array2 if you want to delete from that array instead.
@array3 = map $array3[$_], @keep_indexes;

print join(' ', @array1), "\n"; # 11 22 33 44 -11 -44 -444
print join(' ', @array2), "\n"; # 11 2 3 44 5 44
print join(' ', @array3), "\n"; # -2 -3 -5

我不喜欢那个代码,所以这里有一些警告:

  • 任何时候你给变量名编号(@array1@array2 等),你都会陷入混乱。您需要更好的变量名称,或者更有可能的是更好的数据结构。
  • 每当您发现自己从事维护并行数组的业务时,都应该考虑更好的数据结构是否会有所帮助。

【讨论】:

    【解决方案3】:

    您正在从 array2 中删除一个元素,而不是问题中所述的 array3。我认为删除操作将数组元素设置为undef。下一次循环时,它会检查与 $elem 相同的元素,现在是 undef。因此错误。然后他一次又一次地做同样的事情。

    【讨论】:

    • 数组元素不是delete,而是使用splice。见stackoverflow.com/questions/174292/…。最初的问题希望数组 3 中的元素与 array2 元素具有相同的索引,但是随着从 array2 中删除元素,索引将变得不对齐。这是需要的吗?
    猜你喜欢
    • 2013-05-29
    • 2012-02-15
    • 2013-07-29
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多