Delete_AT n'entre qu'un seul index. Qu'est-ce qu'un bon moyen d'y parvenir en utilisant des méthodes intégrées? Ne doit pas être un ensemble, peut également être un ensemble d'index.
arr = ["a", "b", "c"] set = Set.new [1, 2] arr.delete_at set # => arr = ["a"]
4 Réponses :
Essayez ceci:
arr.reject { |item| set.include? arr.index(item) } # => [a]
Une solution simple pour mon problème, tandis que d'autres ont échoué!
Re-Ouvrez la classe Array et ajoutez une nouvelle méthode pour cela.
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, mais delete_at_indices i> serait un meilleur nom: il conserve la lisibilité de Supprimer_at, mais il est toujours évident qu'il faut plusieurs indices. En ce qui concerne la lisibilité, vous pourriez dire "Supprimer à 3" ou "Supprimer les indices 3, 5 et 7" mais vous ne diriez pas "Supprimer à Multi 3, 5 et 7". (Et bien sûr, pour ceux qui ne sont pas pédants sur l'utilisation du mot "indices", il pourrait y avoir un alias delete_at_indexes i>;)
Approche fonctionnelle:
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"]
one-liner:
Juste une note, car il est difficile de rechercher _ code> Symbole de soulignement - c'est un espace réservé couramment utilisé si vous allez simplement ignorer l'index. Le _ code> est une variable valide, mais la ligne de code ne fait rien avec elle.
doit être nécessairement une modification sur place?
Je suppose que vous utilisez le type de jeu dans
Set.New code> pour assurer l'unicité, plutôt que d'utiliser un autre tableau?