delete_at仅占用一个索引。使用内置方法实现这一点的好方法是什么? 不一定是一个集合,也可以是一个索引数组。基于一组索引删除数组的内容
arr = ["a", "b", "c"]
set = Set.new [1, 2]
arr.delete_at set
# => arr = ["a"]
delete_at仅占用一个索引。使用内置方法实现这一点的好方法是什么? 不一定是一个集合,也可以是一个索引数组。基于一组索引删除数组的内容
arr = ["a", "b", "c"]
set = Set.new [1, 2]
arr.delete_at set
# => arr = ["a"]
一行代码:
arr.delete_if.with_index { |_, index| set.include? index }
只是一个注释,因为很难搜索'_'下划线符号 - 它是一个占位符如果你只是忽略索引,这是常用的。 '_'是一个有效的变量,但是代码行并没有做任何事情。 – Mirv
试试这个:
arr.reject { |item| set.include? arr.index(item) } # => [a]
这是一个有点难看,我想;)也许有人提出一个更好的解决方案?
我的问题的一个简单的解决方案,而其他人失败了! – dariush
重新打开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"]
这当然可以写成独立的方法,如果你不想重新打开班级。确保索引的顺序相反是非常重要的,否则你可以在数组中稍后改变元素中应该被删除的元素的位置。
+1,但* delete_at_indices *将是一个更好的名称:它保留了delete_at的可读性,但仍然很明显它需要多个索引。就可读性而言,你可能会说“删除3”或“删除索引3,5和7”,但你不会说“删除多3,5和7”。 (当然,对那些没有使用“索引”这个词的学生来说,可能会有一个别名* delete_at_indexes *;) – iconoclast
功能的方法:
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"]
必须是必然就地修改? – tokland
我认为你使用Set.new中的Set类型来确保唯一性,而不是仅仅使用另一个数组? – Mirv