如何删除数组的前五个元素?

Posted

技术标签:

【中文标题】如何删除数组的前五个元素?【英文标题】:How do I remove the first five elements of an array? 【发布时间】:2011-07-05 02:34:02 【问题描述】:
@array = qw(one two three four five six seven eight);
<Some command here>
print @array;

【问题讨论】:

Perl 的数组处理非常深入。您不一定需要销毁数组才能对其进行操作。这只是例如print join("\n", @array[5..$#array]), $/; 太补充了 Ashley 所说的,我几乎从来没有发现需要从数组中删除元素,除非我将它用作堆栈。我怀疑你可以改进你的代码,以便不添加五个元素(如果它们是不必要的),或者像 Ashley 的示例中那样使用数组切片来获取你需要的元素而不破坏数组。跨度> 一个非常简单的问题,6 个不同的工作答案和计数。你只需要喜欢 perl :) @Cyber​​-Guard Design,听听听听! 【参考方案1】:

这里有几种方法,按照愚蠢程度递增的顺序:

使用slice:

@array = @array[ 5 .. $#array ];

使用splice

splice @array, 0, 5;

使用shift

shift @array for 1..5;

使用grep

my $cnt = 0;
@array = grep  ++$cnt > 5  @array;

使用map

my $cnt = 0;
@array = map  ++$cnt < 5 ? ( ) : $_  @array;

我敢肯定,黑客比我想出的更愚蠢的方法要好得多。 :)

【讨论】:

我喜欢地图解决方案,它很整洁 我不明白地图是如何工作的,我想我应该问一个问题。 Map 将循环通过@array,并且仅在循环通过前五个元素后将元素分配回数组。三元条件和$cnt 变量用于评估我们是否已经遍历了这五个元素。 我还是不明白:如果 $cnt 小于 5 则列出,否则 $_ = 什么? @friedo => 如果按增加的愚蠢度排序,则将前两个示例转置。 splice 是执行此操作的操作,并且可以有效地执行此操作。自分配数组切片必须复制每个切片元素,并且在最坏的情况下需要2*n 空间来这样做。事实上,我可能会将它放在重复班次示例的下方。【参考方案2】:

您正在寻找 splice 内置函数:

splice @array, 0, 5;

【讨论】:

【参考方案3】:

splice @array, 0, 5; 会做到的。

【讨论】:

splice 仅适用于数字。不适用于数组中的字符串元素【参考方案4】:

作为对friedo 答案的评论并展示酷炫的新声明state,这里使用grep,friedo 的map 模仿。

#!/usr/bin/perl

use strict;
use warnings;

use feature 'state';

my @array = qw(one two three four five six seven eight);

my @new_array = grep state $count; ++$count > 5 @array;

print "$_\n" for @new_array; 

【讨论】:

【参考方案5】:

我刚刚意识到你只需要最后一个字符串,所以不需要循环

   my $_ = "@array"; s|(?:.*?\s)5||;say;

顺便说一句,这可能是效率最低的方法,只是玩得开心:)

【讨论】:

致反对者:虽然这不是“最好”的方法,但我的代码仍然有效,您应该意识到我提供的答案只是作为上述“更”正确解决方案的另一种选择. 我没有投反对票,但我的猜测是因为如果@array 的任何元素包含空格或$" ne ' ',此解决方案将中断。 很好的发现。我会努力解决这个问题

以上是关于如何删除数组的前五个元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何高效的对有序数组去重

LeetCode:删除排序数组中的重复项||80

LeetCode(80):删除排序数组中的重复项 II

leetcode-80-删除排序数组中的重复项 II

如何获取字符串的前五个字符

每天一道面试题--删除排序数组中的重复项 II(python实现)