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