Arrays 如何从指定索引的数组中删除元素,因为索引本身就在数组中?
我正在使用Ruby 2.4。如果我有一组数组索引,并且我想删除这些索引中的所有元素,我该怎么做?我试过下面的方法,但是漏掉了一些东西Arrays 如何从指定索引的数组中删除元素,因为索引本身就在数组中?,arrays,ruby,Arrays,Ruby,我正在使用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",
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"]
请注意结束数组。我在数组中应该只有七个元素,因为我从十开始,然后在数组中指定了三个要删除的元素索引。但我有八个要素。如何调整语句以删除指定索引处的元素?每次从数组中删除项时,索引都会更改 所以你可以这样做:
3.times { a.delete_at(7) }
具有与删除第7、8、9条相同的效力
或者使用slice代码>如此处所建议:
要使用任意数组,我认为最明显的选择是使用索引拒绝:
a.reject.with_index { |item, idx| indexes_to_delete.include? idx }
这是非变异的,因此您需要设置一个等于结果的变量 每次从数组中删除项时,索引都会更改
所以你可以这样做:
3.times { a.delete_at(7) }
具有与删除第7、8、9条相同的效力
或者使用slice代码>如此处所建议:
要使用任意数组,我认为最明显的选择是使用索引拒绝:
a.reject.with_index { |item, idx| indexes_to_delete.include? idx }
这是非变异的,因此您需要设置一个等于结果的变量 这里有几种方法可以做到这一点
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"]
首先我们计算“看守人”
这不会变异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给出了第三种方法(拒绝。使用_index
),对我来说最合适。我怀疑这三者之间是否存在显著的效率差异。这里有几种方法可以做到这一点
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"]
首先我们计算“看守人”
这不会变异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给出了第三种方法(拒绝。使用_index
),对我来说最合适。我怀疑这三者之间是否存在显著的效率差异。您的问题是,在执行删除操作时,索引会发生变化。所以先不要删除
a = ["a","b","c","d","e","f","g","h","i","j"]
to_delete = [7,8,9]
to_delete.each { |i| a[i] = nil }
a.compact!
将要删除的元素设置为nil,然后压缩数组以删除这些元素
如果您想要保留nil元素,但是您知道数组中永远不会有一个值,那么您可以这样做
MARK = special value
to_delete.each { |i| a[i] = MARK }
a.delete(MARK)
您的问题是,在执行删除操作时,索引会发生更改。所以先不要删除
a = ["a","b","c","d","e","f","g","h","i","j"]
to_delete = [7,8,9]
to_delete.each { |i| a[i] = nil }
a.compact!
将要删除的元素设置为nil,然后压缩数组以删除这些元素
如果您想要保留nil元素,但是您知道数组中永远不会有一个值,那么您可以这样做
MARK = special value
to_delete.each { |i| a[i] = MARK }
a.delete(MARK)
索引并不总是7、8和9。。。这些只是我举的例子来说明我的观点。我正在寻找一个适用于任何数字索引数组的答案(您可以假设所有索引在任何删除之前都引用数组中的有效元素)。索引并不总是7、8和9。。。这些只是我举的例子来说明我的观点。我正在寻找一个适用于任何数字索引数组的答案(您可以假设所有索引在任何删除之前都引用数组中的有效元素)。只要a
不包含nil
元素(要保留),这个答案就行得通。呃,回答太快的诅咒。只要a
不包含nil
元素(这些元素将被保留),这就行了。呃,回答太快的诅咒。如果可以的话,我建议,0…a.size
而不是0..a.size-1
@sagarpandya82,在被2对3点咬了几次之后,我决定一直使用2。如果可以的话,我建议用0…a.size
代替0..a.size-1
@sagarpandya2,在被2对3点咬了几次之后,我决定一直使用2。