user2420858
user2420858

Reputation: 27

How can I stop the lines from repeating?

Look at this code. I got the desired result, which was to scan a person's input to see if it matches an internal array.

sentence = []
compare = []
database_array = ["Mouse", "killer", "Blood", "Vampires", "True Blood", "Immortal" ]

def parser_sentence compare
    database_array = ["Mouse", "killer", "Blood", "Vampires", "True Blood", "Immortal"]
    initial_index = 0
while compare.count > initial_index      
          compare.each do |item| 
         if item == database_array[initial_index]
            puts "You found the key word, it was #{item}"
          else
            puts "Sorry the key word was not inside your sentence"

          end
         end 
  initial_index = initial_index + 1
 end
end

puts "Please enter in your sentences of words and i will parse it for the key word."
sentence = gets.chomp
compare = sentence.split (" ")

Because each loop is telling it to repeat, it does so, but how can I stop this?

Upvotes: 0

Views: 112

Answers (2)

Mark Thomas
Mark Thomas

Reputation: 37517

In this case, regex will be more efficient and less error prone than splitting the input string, especially since you have a two-word phrase in the keyword list.

def parser_sentence(sentence)
  matching_words = sentence.scan(Regexp.union(database_array))
  if matching_words.empty?
    puts "Sorry the key word was not inside your sentence"
  else
    puts "You found the key word, it was #{matching_words.join(" ")}"
  end
end

Slight modifications can make it case sensitive (if you need it), or add word boundaries to the keywords so as to not match partial words.

Upvotes: 2

Paul Richter
Paul Richter

Reputation: 11082

One possible solution that doesn't involve looping is to intersect your compare and database_array arrays, like so:

matching_words = compare & database_array

This will compare both arrays and create a new array containing only elements that are common to both. For example:

# If the user input the sentence "The Mouse is Immortal", then...
compare = ["The", "Mouse", "is", "Immortal"]
# matching_words will contain an array with elements ["Mouse", "Immortal"]
matching_words = compare & database_array

You can then check the length of the array and display out your messages. I believe this can replace your entire function like so:

def parser_sentence compare
    matching_words = compare & database_array
    if matching_works.length > 0
        puts "You found the key word, it was #{matching_words.join(" ")}"
    else
        puts "Sorry the key word was not inside your sentence"
    end
end

Note about the use of join, if you're unfamiliar with that, it basically creates a string using each element in the array separated by the separator string passed in, which in my example is merely a blank space; substitute for your own separate of course, or whatever you want to do with it.

Upvotes: 1

Related Questions