根据很长的单词列表(所有可用英语单词列表)验证gets
输入的最佳方法是什么?
我目前正在使用readlines
来操作文本,但在进行任何操作之前,我想首先根据列表验证条目。
答案 0 :(得分:2)
最简单的方法,但绝不是最快的方法,就是每次只搜索单词列表。如果单词列表在数组中:
if word_list.index word
#manipulate word
end
但是,如果您将单词列表作为单独的文件(每个单词在一个单独的行上),那么我们将使用File#foreach
来查找它:
if File.foreach("word.list") {|x| break x if x.chomp == word}
#manipulate word
end
请注意,foreach
不会删除尾随的换行符,因此我们使用String#chomp
删除它们。
答案 1 :(得分:2)
这是一个使用Set
的简单示例,尽管Mark Johnson是对的,
布隆过滤器会更有效率。
require 'set'
WORD_RE = /\w+/
# Read in the default dictionary (from /usr/share/dict/words),
# and put all the words into a set
WORDS = Set.new(File.read('/usr/share/dict/words').scan(WORD_RE))
# read the input line by line
STDIN.each_line do |line|
# find all the words in the line that aren't contained in our dictionary
unrecognized = line.scan(WORD_RE).find_all { |term| not WORDS.include? term }
# if none were found, the line is valid
if unrecognized.empty?
puts "line is valid"
else # otherwise, the line contains some words not in our dictionary
puts "line is invalid, could not recognize #{unrecognized.inspect}"
end
end
答案 2 :(得分:0)
答案 3 :(得分:0)
将单词列表读入内存,并为每个单词输入一个哈希表:
def init_word_tester
@words = {}
File.foreach("word.list") {|word|
@words[word.chomp] = 1
}
end
现在你可以根据你的哈希检查每个单词:
def test_word word
return @words[word]
end