2017-08-23 3 views
0

Hallo Ich bin eine Funktion, die ich habe jede Instanz von "du" in einer Zeichenfolge und ersetzen Sie sie durch ein bestimmtes Wort. Ich kann hineingehen und die Instanzen isolieren, kein Problem, aber ich kann die Wörter nicht richtig ausgeben. Bisher habe ich.Ersetzen Sie Wörter in einer Zeichenfolge und wieder beitreten

def autocorrect(input) 

#replace = [['you','u'], ['your sister']] 
#replace.each{|replaced| input.gsub!(replaced[0], replaced[1])} 
input.split(" ") 

if (input == "u" && input.length == 1) || input == "you" 
    input.replace("your sister") 
end 

input.join(" ") 
end 

Der ideale Ausgangs wäre:

autocorrect("I am so smitten with you") 

"I am smitten with your sister" 

Ich weiß nicht, wie der letzte Teil richtig, ich nicht eine gute Methode denken kann, zu verwenden. Jede Hilfe würde sehr geschätzt werden.

+1

'input ==" u "' impliziert, dass "input.length" 1 ist. Die letzte Überprüfung ist redundant. – Stefan

Antwort

2

Das Problem, das Sie mit Ihrem Code sind ist, dass Sie input.split(" ") nennen, aber sie tun nicht sparen, das zu etwas, und dann überprüfen Sie input == "u" # ... und input ist immer noch die gesamte Zeichenfolge, wenn Sie also autocorrect('u') genannt oder autocorrect('you') Sie "your sister" zurück, ex bekommen würde cept für die nächste Zeile: input.join(" ") wird einen Fehler auslösen.

Dieser Fehler ist, weil erinnern, input ist immer noch die ursprüngliche Zeichenfolge, kein Array von jedem Wort, und Zeichenfolgen haben keine join Methode.

Um Ihren Code arbeiten mit den wenigsten Änderungen möglich zu erhalten, können Sie es ändern:

def autocorrect(input) 
    #replace = [['you','u'], ['your sister']] 
    #replace.each{|replaced| input.gsub!(replaced[0], replaced[1])} 
    input.split(" ").map do |word| 
    if (word == "u" && word.length == 1) || word == "you" 
     "your sister" 
    else 
     word 
    end 
    end.join(" ") 
end 

jetzt also, Sie sind mit jedem Wort, nachdem Sie etwas zu tun split(" ") der Eingang, und Sie sind Überprüfen jedes Wort gegen "u" und "you", anstelle der gesamten Eingabezeichenfolge. Sie ordnen dann entweder das Ersatzwort oder das Original zu und fügen sie dann zu einer einzelnen Zeichenfolge zurück, um sie zurückzugeben.


Als Alternative kürzere Weise können Sie String#gsub verwenden, die ein Hash nehmen kann als der zweite Parameter Ersetzungen zu tun:

Wenn das zweite Argument ein Hash ist, und der zugehörige Text ist einer seiner Schlüssel ist der entsprechende Wert der Ersetzungsstring.

def autocorrect(input) 
    replace = { 'you' => 'your sister', 
       'u' => 'your sister', 
       'another word' => 'something else entirely' } 

    input.gsub(/\b(#{replace.keys.join('|')})\b/, replace) 
end 

autocorrect("I am u so smitten with utopia you and another word") 
# => "I am your sister so smitten with utopia your sister and something else entirely" 

die Regex in diesem Beispiel suchen kommt aus wie:

/\b(you|u|another word)\b/ 

mit \b Grenze jedes Wort zu sein.

1

Einfache Array-Mapping würde die Arbeit machen:

"I am u so smuitten with utopia you".split(' ').map{|word| %w(you u).include?(word) ? 'your sister' : word}.join(' ') 
#=> "I am your sister so smuitten with utopia your sister" 

Ihre Methode wäre:

def autocorrect(input) 
    input.split(' ').map{|word| %w(you u).include?(word) ? 'your sister' : word}.join(' ') 
end 

autocorrect("I am so smitten with you") 
#=> "I am smitten with your sister" 
+0

Es funktioniert nicht für mich. –

Verwandte Themen