If i want to see if a list contains a particular word how would i go
about doing so with letter case not being important. Normally two words
spelt the same are not equal if they differ in case.
i.e. Shell != shell
or ShEll != shell
At first i thought simply conveting both the list and the word to search
into uppercase thus making them the same but doing so would not be very
efficient if the list is very big.
If i want to see if a list contains a particular word how would i go
about doing so with letter case not being important. Normally two words
spelt the same are not equal if they differ in case.
i.e. Shell != shell
or ShEll != shell
At first i thought simply conveting both the list and the word to search
into uppercase thus making them the same but doing so would not be very
efficient if the list is very big.
Any ideas??
data = [‘ShEll’, ‘heLLO’]
data.each do |word|
if /shell/i =~ word
puts ‘found shell’
end
If i want to see if a list contains a particular word how would i go
about doing so with letter case not being important. Normally two words
spelt the same are not equal if they differ in case.
i.e. Shell != shell
or ShEll != shell
At first i thought simply conveting both the list and the word to search
into uppercase thus making them the same but doing so would not be very
efficient if the list is very big.
If i want to see if a list contains a particular word how would i go
about doing so with letter case not being important. Normally two words
spelt the same are not equal if they differ in case.
i.e. Shell != shell
or ShEll != shell
At first i thought simply conveting both the list and the word to search
into uppercase thus making them the same but doing so would not be very
efficient if the list is very big.
the reg exp. looks good but when i try to apply it to help me romove
duplicates from a list it doesnt seem to work
list = %w{adam Adam bobby Bobby wild wILd}
list.sort
list.each_index do |x|
list.delete_at(x) if (/list[x]/i =~ list[x+1])
here you’re literally searching for the text “list[x]”, not the value of
that expression. You need to use interpolation to place the value of
that variable into the regular expression. Use #{expr}, like you would
in a string:
list.delete_at(x) if ( /#{list[x]}/i =~ list[x+1])
If your strings might contain punctuation characters, you should also
look into Regexp.escape to ensure these are dealt with safely.
the reg exp. looks good but when i try to apply it to help me romove
duplicates from a list it doesnt seem to work
list = %w{adam Adam bobby Bobby wild wILd}
list.sort
list.each_index do |x|
list.delete_at(x) if (/list[x]/i =~ list[x+1]) #remove entries which
have same spelling but in diff. case
end
puts “”
puts list
in this list i consider adam and Adam duplicates because they have the
same spelling but only different case. Why doesnt my if clause pick up
on this?
You should never consider a regex good looking. regexes should be
avoided whenever possible in favor of String methods. Better solutions
have been posted.
Robert K. wrote:
I would use another algorithm because of efficiency:
list.delete_if
Repeatedly deleting elements from the middle of an array is certainly
not efficient. Also, suppose the results are:
[Adam Bobby wILd]
Looking at the results, you would have no way of knowing whether there
were duplicates spelled: adam, bobby, and wild. Therefore, the case of
the results appears to be irrelevant. If the case of the results is
irrelevant, then just providing the set is enough:
require ‘set’
ensure random order
list = %w{adam Adam bobby Bobby wild wILd}.sort_by { rand }
results = Set.new
list.each do |elmt|
results << elmt.downcase
end
You should never consider a regex good looking. regexes should be
avoided whenever possible in favor of String methods. Better solutions
have been posted.
I would not subscribe to that rule. Often regular expressions are
faster than pure String based approaches - it depends on the issue at
hand.
Looking at the results, you would have no way of knowing whether there
were duplicates spelled: adam, bobby, and wild. Therefore, the case of
the results appears to be irrelevant. If the case of the results is
irrelevant, then just providing the set is enough:
Alternatively one could use a Hash to preserve all spellings:
irb(main):001:0> list = %w{adam Adam bobby Bobby wild wILd}.sort_by {
rand }
=> [“wild”, “wILd”, “Adam”, “adam”, “Bobby”, “bobby”]
irb(main):002:0> res = Hash.new {|h,k| h[k]=[]}
=> {}
irb(main):003:0> list.each {|w| res[w.downcase] << w}
=> [“wild”, “wILd”, “Adam”, “adam”, “Bobby”, “bobby”]
irb(main):004:0> res
=> {“bobby”=>[“Bobby”, “bobby”], “wild”=>[“wild”, “wILd”],
“adam”=>[“Adam”, “adam”]}
irb(main):005:0>