给出:
n = 2
arr = %w(10 20 30 40 50)
这是一种删除索引n
之后的所有数组元素的方法:
arr.delete_if {|num| arr.index(num) > n }
# => ["10", "20", "30"]
还有其他方法可以在不迭代和比较条件的情况下从数组中删除所有元素吗?
答案 0 :(得分:4)
Array#[]=
运算符非常有用:
arr[n+1 .. -1] = []
在Ruby 2.6中,您还可以使用无限范围:
arr[n+1 ..] = []
请注意,您的代码很慢,因为它会在数组中搜索每个元素,因此是O(n^2)
,但是如果数组包含重复元素,也是错误的。例如,使用arr = %w(10 20 30 10 20)
,您的代码不会更改数组。这将是您的代码,只会更快,更正确(O(n)
;尽管上面的#[]=
解决方案甚至更快,更直接):
arr.delete_if.with_index { |num, idx| idx > n }
答案 1 :(得分:3)
您可以使用Array#slice!
删除特定索引范围内的元素,例如:
arr = %w(10 20 30 40 50)
arr.slice!(3..-1) #=> ["40", "50"]
arr #=> ["10", "20", "30"]
请注意,slice!
还会返回删除的部分。
答案 2 :(得分:2)
您正在删除索引大于n=2
的元素,并获取数组的其余部分,您可以简单地将其获取为
arr = arr[0..2]
以上将重新生成新数组,arr
引用将指向该数组。
更新:对于 Cary Swoveland 在评论中主张的观点,
无需更新新数组即可更新数组,
# This one will have same object id or we can say, do not point to new array
arr.replace(arr[0,3])