Retour index de toutes les occurrences d'un caractère dans une chaîne de caractères en ruby
Je suis en train de retourner à l'indice de toutes les occurrences d'un caractère particulier dans une chaîne de caractères à l'aide de Ruby. Un exemple de chaîne est "a#asg#sdfg#d##"
et le rendement attendu est [1,5,10,12,13]
lors de la recherche pour #
caractères. Le code suivant fait le travail, mais il doit y avoir un moyen plus simple de faire cela?
def occurances (line)
index = 0
all_index = []
line.each_byte do |x|
if x == '#'[0] then
all_index << index
end
index += 1
end
all_index
end
Vous devez vous connecter pour publier un commentaire.
[x, y]
signifie "une sous-chaîne de longueury
de départ àx
", qui est le même que[x]
, qui signifie "caractère dex
(aussi une chaîne parce que ruby n'ont pas de type Char)".ETA: Cela passe par la création d'un Énumérateur qui utilise
scan(/#/)
comme chaque méthode.analyse des rendements de chaque occurence du motif spécifié (dans ce cas
/#/
) et à l'intérieur du bloc, vous pouvez appeler Regexp.last_match pour accéder à la MatchData objet pour le match.MatchData#begin(0)
renvoie l'index où le match commence et comme nous avons utilisé la carte à l'agent recenseur, nous obtenons un tableau de ces indices back.Voici une manière originale:
Dans un rapide test de vitesse cela était d'environ 3,3 x plus rapide que la FM find_all méthode, et environ 2,5 x plus rapide que sepp2k de enum_for méthode.
Regexp.last_match.begin(0)
c'est le ralentissement de laenum_for
méthode. (C'est, j'espère queenum_for
lui-même n'est pas le problème). De toute façon, j'aime que ce est à la fois simple et lisible. Moins de fantaisie est souvent plus bon.Voici une longue méthode de la chaîne:
nécessite 1.8.7+
.each_char.with_index
(au lieu deeach_char.each_with_index
). Il lit mieux de cette façon, je pense.Une autre solution dérivée de FMc de la réponse:
J'aime que Ruby n'a jamais une seule manière de faire quelque chose!
Voici une solution pour massive des chaînes de caractères. Je suis en train de faire texte trouve sur 4,5 MO de chaînes de texte et les autres solutions de stagner. Cette méthode tire parti du fait que ruby .split est très efficace par rapport à la chaîne de comparisions.
C'est essentiellement à l'aide de la puissance derrière la .méthode split, puis en utilisant les différentes pièces et de la longueur de la chaîne recherchée pour travailler sur les lieux. J'ai passé de 30 secondes à l'aide de diverses méthodes pour instantanées sur de très grandes chaînes.
Je suis sûr qu'il ya une meilleure façon de le faire, mais:
ajoute quelque chose à la fin de la chaîne dans le cas où la cible se trouve à la fin (et le partage des travaux), mais aussi assurez-vous que le "hasard" outre ne contient pas la cible elle-même.