2009-03-31 5 views

Répondre

2

La façon la plus simple, mais certainement pas le plus rapide, est de rechercher simplement contre le mot liste à chaque fois. Si la liste de mots est dans un tableau:

if word_list.index word 
    #manipulate word 
end 

Cependant, si vous aviez la liste de mots dans un fichier séparé (avec chaque mot sur une ligne distincte), nous allons utiliser File#foreach pour le trouver:

if File.foreach("word.list") {|x| break x if x.chomp == word} 
    #manipulate word 
end 

Notez que foreach décaper le caractère de retour à la ligne de fuite (s), donc nous débarrasser d'eux avec String#chomp.

+0

Cela a fait l'affaire ... j'ai été en mesure d'envelopper mon programme et de créer un message d'erreur si le mot ne correspond pas. Merci. – supergalactic

0

lisez-vous la liste d'un fichier? ne pouvez-vous pas tout avoir en mémoire? peut-être un finger tree peut vous aider à sinon, il n'y a pas plus de « lire un bloc de données à partir du fichier et grep dans »

2

Voici un exemple simple utilisant un Set, bien que Mark Johnson ait raison, un filtre bloom serait plus efficace.

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 
+0

vous avez évidemment beaucoup plus d'expérience que moi :) je vais étudier cela – supergalactic

+0

Je vais baliser mon exemple pour en faire un peu meilleur guide d'étude. – rampion

0

Lire la liste de mots en mémoire, et pour chaque mot, faire une entrée dans une table de hachage:

def init_word_tester 
    @words = {} 

    File.foreach("word.list") {|word| 
     @words[word.chomp] = 1 
    } 
end 

maintenant vous pouvez simplement vérifier chaque mot contre votre hachage:

def test_word word 
    return @words[word] 
end 
Questions connexes