11
votes

Supprimer le contenu de la matrice basé sur un ensemble d'index

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


2 commentaires

doit être nécessairement une modification sur place?


Je suppose que vous utilisez le type de jeu dans Set.New pour assurer l'unicité, plutôt que d'utiliser un autre tableau?


4 Réponses :


3
votes

Essayez ceci:

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


1 commentaires

Une solution simple pour mon problème, tandis que d'autres ont échoué!



6
votes

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 commentaires

+1, mais delete_at_indices 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 ;)



0
votes

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


0 commentaires

21
votes

one-liner: xxx


1 commentaires

Juste une note, car il est difficile de rechercher _ Symbole de soulignement - c'est un espace réservé couramment utilisé si vous allez simplement ignorer l'index. Le _ est une variable valide, mais la ligne de code ne fait rien avec elle.