首页 文章

在循环Perl中删除数组中的元素

提问于
浏览
0

我想创建一个循环,我遍历一个数组中的所有元素(@ 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++;
            }
        }
    }

3 回答

  • 1

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

  • 0

    好吧,这是处理问题的一种方法(在某种程度上我理解你想做什么) . 每当您需要回答有关成员资格的问题时,您可能希望使用哈希值 .

    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 等),你都会感到困惑 . 您需要更好的变量名称,或者更可能的是更好的数据结构 .

    • 任何时候你发现自己都在维护并行数组,你应该考虑一个更好的数据结构是否会有所帮助 .

  • 1

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

相关问题