Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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
Ruby 基于一组索引删除数组的内容_Ruby - Fatal编程技术网

Ruby 基于一组索引删除数组的内容

Ruby 基于一组索引删除数组的内容,ruby,Ruby,delete_at只接受一个索引。使用内置方法实现这一点的好方法是什么? 不必是一个集合,也可以是一个索引数组 arr = ["a", "b", "c"] set = Set.new [1, 2] arr.delete_at set # => arr = ["a"] 试试这个: arr.reject { |item| set.include? arr.index(item) } # => [a] 我觉得有点难看;)也许有人建议一个更好的解决方案?重新打开Array类并为此添加一

delete_at只接受一个索引。使用内置方法实现这一点的好方法是什么? 不必是一个集合,也可以是一个索引数组

arr = ["a", "b", "c"]
set = Set.new [1, 2]
arr.delete_at set
# => arr = ["a"]
试试这个:

arr.reject { |item| set.include? arr.index(item) }  # => [a]

我觉得有点难看;)也许有人建议一个更好的解决方案?

重新打开Array类并为此添加一个新方法

class Array

  def delete_at_multi(arr)
    arr = arr.sort.reverse # delete highest indexes first.
    arr.each do |i|
      self.delete_at i
    end
    self
  end

end

arr = ["a", "b", "c"]
set = [1, 2]

arr.delete_at_multi(set)

arr # => ["a"]
当然,如果您不想重新打开该类,可以将其编写为一个独立的方法。确保索引的顺序相反是非常重要的,否则您会在以后更改数组中应该删除的元素的位置。

功能方法:

class Array
  def except_values_at(*indexes)
    ([-1] + indexes + [self.size]).sort.each_cons(2).flat_map do |idx1, idx2|
      self[idx1+1...idx2] || []
    end
  end
end

>> ["a", "b", "c", "d", "e"].except_values_at(1, 3)
=> ["a", "c", "e"]
一艘班轮:

arr.delete_if.with_index { |_, index| set.include? index }

必须是就地修改吗?我想您使用的是
Set.new中的Set类型,以确保唯一性,而不仅仅是使用另一个数组?+1,但delete_at_索引将是一个更好的名称:它保留delete_at的可读性,但仍然明显地表明它需要多个索引。就可读性而言,您可能会说“在3处删除”或“在索引3、5和7处删除”,但不会说“在3、5和7处删除”。(当然,对于那些不喜欢使用“索引”这个词的人来说,可能会有一个别名delete_at_index;)这是解决我问题的简单方法,而其他人却失败了!请注意,因为很难搜索下划线符号-如果忽略索引,通常会使用此占位符。
是一个有效的变量,但代码行与之无关。