Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何从指定索引的数组中删除元素,因为索引本身就在数组中?_Arrays_Ruby - Fatal编程技术网

Arrays 如何从指定索引的数组中删除元素,因为索引本身就在数组中?

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",

我正在使用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"]

请注意结束数组。我在数组中应该只有七个元素,因为我从十开始,然后在数组中指定了三个要删除的元素索引。但我有八个要素。如何调整语句以删除指定索引处的元素?

每次从数组中删除项时,索引都会更改

所以你可以这样做:

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。