我正在使用 Ruby 2.4。如果我有一组数组索引,并且我想删除这些索引处的所有元素,我该怎么做?我尝试了下面的方法,但它遗漏了一些东西
2.4.0 :005 > indexes_to_delete = [7, 8, 9]
=> [7, 8, 9]
2.4.0 :008 > a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
2.4.0 :009 > indexes_to_delete.each do |index| a.delete_at(index) end
=> [7, 8, 9]
2.4.0 :010 > a
=> ["a", "b", "c", "d", "e", "f", "g", "i"]
注意结束数组。我应该在数组中只有七个元素,因为我从十个开始,然后指定了要在数组中删除的三个元素索引。然而我有八个元素。如何调整语句以删除指定索引处的元素?
这里有几种方法可以做到这一点。
indexes_to_delete = [3, 8, 9]
a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
#1
indexes_to_delete.sort.reverse_each { |i| a.delete_at(i) }
a #=> ["a", "b", "c", "e", "f", "g", "h"]
这变异了a
。如果不需要,请对a
( a.dup
)的副本进行操作。
请记住,您必须按照与索引相反的顺序删除元素。
#2
a.values_at(*(0..a.size-1).to_a - indexes_to_delete)
#=> ["a", "b", "c", "e", "f", "g", "h"]
首先我们计算“守门员”
(0..a.size-1).to_a - indexes_to_delete
#=> [0, 1, 2, 4, 5, 6]
这不会变异a
。如果a
要变异写
a.replace(a.values_at(*(0..a.size-1).to_a - indexes_to_delete))
#=> ["a", "b", "c", "e", "f", "g", "h"]
a #=> ["a", "b", "c", "e", "f", "g", "h"]
@maxple 给出了第三种方式 ( reject.with_index
),这对我来说是最好的。我怀疑这三者之间是否存在显着的效率差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句