如何从数组中删除一系列值?

12
如果array=[1,2,3,4,5,6,7,8,9],我想从数组中删除一系列元素。
例如:我想从该数组中删除索引范围为2..5的所有元素,结果应为[1, 2, 7, 8, 9]
提前感谢。

2..5 是索引范围而不是值。 - Guna Sekhar
你的问题不够清晰。你真正想做什么?是要删除索引为2..5的值,也就是2、3、4和5吗?还是你想删除那些在2..5之间或与之匹配的值? - Surya
5个回答

25

使用slice!方法:

删除由区间指定的元素。

array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.slice!(2..5)
array #=> [1, 2, 7, 8, 9]

1
你的代码简单而有效。我差点忘记了“slice!” - Bala
这应该包括 2 而不包括 5 吗? - Roman Kiselenko
1
@Зелёный的索引2..5指的是值3、4、5和6。 - Stefan
1
很好的解决方案,Stefan。如果那个投票者站出来为他/她的负面评价辩护,我会感到惊讶和震惊。 - Cary Swoveland

3
你可以尝试这个。
[1, 2, 3, 4, 5, 6, 7, 8, 9].reject.with_index{|element,index| index >= 2 && index <= 5}
=> [1, 2, 7, 8, 9]

或者使用delete_if

[1, 2, 3, 4, 5, 6, 7, 8, 9].delete_if.with_index{|element,index| index >= 2 && index <= 5}
=> [1, 2, 7, 8, 9]

1

正如Stefan所说,使用slice!来删除数组中特定范围内的值。然而,如果你需要删除在某个特定范围内的值,则使用delete_if

array = [9, 8, 7, 6, 5, 4, 3, 2, 1]
array.delete_if {|value| (2..5) === value }
array  #=> [9, 8, 7, 6, 1]

1

删除包含值的范围

其中一种方法是使用带有块的Array#delete_if调用,该块检查数组的每个元素是否包含在范围内,使用Array#include?。例如:

array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.delete_if { |i| (2..5).include? i }
#=> [1, 6, 7, 8, 9]

1
为什么要发布两个单独的答案?有一个“编辑”链接。 - trushkevich

-1

按范围索引删除数组元素

如果您想通过索引而不是值来删除元素,一个解决方法是遍历您的范围对象,并为范围中的每个索引调用Array#delete_at。例如:

array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
(2..5).map { |i| array.delete_at i }
##=> [3, 5, 7, 9]

为什么要发布两个单独的答案?有一个“编辑”链接。 - trushkevich
1
这样不行,array.delete_at 在你迭代时改变了数组。 - yuzhoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接