验证单词文件输入的最简单方法是什么?

时间:2009-03-31 19:05:34

标签: ruby

根据很长的单词列表(所有可用英语单词列表)验证gets输入的最佳方法是什么?

我目前正在使用readlines来操作文本,但在进行任何操作之前,我想首先根据列表验证条目。

4 个答案:

答案 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)

你正在从文件中读取列表吗? 难道你不记得了吗? 也许finger tree可以帮到你 如果没有,只有“从文件读取一大块数据并grep into”

答案 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