循环遍历两个数组,删除perl中的重叠

前端之家收集整理的这篇文章主要介绍了循环遍历两个数组,删除perl中的重叠前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两组范围,由[start,stop]值表示.一些范围重叠,这意味着一个范围的开始位于另一个范围的[开始,停止]之间.我想制作一组没有这种重叠的新范围,并且不包括范围内的任何新值.

范围看起来像这样:

@starts  @ends
      5    108 
      5    187
     44    187
     44    229 
     44    236 
     64    236 
    104    236
    580    644
    632    770

我期望的输出是这样的:

@starts  @ends
      5    236
    580    770

这是因为前七个范围与从5 =>的间隔重叠. 236和最后两个重叠,间隔从632 => 770.

这是我试过的代码

$fix = 0;
foreach (@ends) {  
    if ($starts[$fix + 1] < $ends[$fix]) {
        splice(@ends,$fix,$fix);
        splice(@starts,$fix + 1,$fix + 1);
    } else {
        $fix += 1;
    }
}

我可以自己打印出这些值,我只需要帮助合并算法.

解决方法

这会就地编辑您的数组,只是在重叠时折叠边界.

# Since they're sorted by @starts,accept the 0th interval,start at 1
for (1..$#starts) {
    # extra check on array bounds,since we edit in-place
    last unless $_ < @starts;
    # don't need to collapse if no overlap with prevIoUs end
    next unless $starts[$_] <= $ends[$_-1];
    # delete this start and the prevIoUs end
    splice(@starts,$_,1);
    splice(@ends,$_-1,1);
    # rerun this loop for the same value of $_ since it was deleted
    redo;
}

猜你在找的Perl相关文章