2017-05-07 5 views
-1

Also für meine Programmierklasse habe ich ein AI-Programm eingereicht, das Wörter basierend auf Statistiken aus einer Beispielzeichenfolge generiert. Allerdings verlangsamte sich die folgenden Zeilen Code immens das Programm nach unten:Beschleunigen eines Programms durch Initialisierung

//Opens and reads the Dictionary 
Scanner inputFile = new Scanner(new File("common_words.txt")); 
while (inputFile.hasNext()) { 
    wordCheck = inputFile.nextLine(); 
    if (wordCheck.equalsIgnoreCase(aiWord)) {//Stops dictionary if word is found 
     inputFile.close(); 
     break; 
    // ... 

Dieser Vorgang wurde wiederholt, bis ein Wort geschaffen wurde, die in der Wortliste aufgenommen wurde. Meine Frage ist, könnte der Prozess beschleunigt werden, wenn ich die Wortliste in ein Array initialisiert habe? Ich denke, dann würde ich aus dem RAM anstelle von HDD lesen. Ich habe versucht, dies in meinen Code zu implementieren, aber es war zu kompliziert, um sie zu verbinden. <

+1

ein 'java.util.List' des Wortes verwenden (alle Groß- oder Klein wenn Sie Groß- und Kleinschreibung Suche) und' List # enthält 'vielleicht –

+0

Wie groß ist common-words.txt? Wenn es in den Speicher passt, gehen Sie mit einer HashMap –

+1

yeah, wenn möglich, lesen Sie dies in einem einzigen Speicherobjekt. Das ständige Öffnen und Lesen einer Datei wird sehr langsam sein. Wenn die Datei * sehr * groß ist, müssen Sie möglicherweise eine Art Indexierungsschema erstellen, damit die Datei (oder Teile davon) schneller gelesen werden kann. – markspace

Antwort

2

Es wäre besser, für die Geschwindigkeit ein HashSet zu verwenden, die Sie nur einmal einrichten einen statischen Initialisierer verwenden, etwa so:

private static final Set<String> lowerCaseWords = new HashSet<String>(); 
static { 
    final Scanner inputFile = new Scanner(new File("common_words.txt")); 
    while (inputFile.hasNextLine()) { 
     lowerCaseWords.add(inputFile.nextLine().toLowerCase()); 
    } 
    inputFile.close(); 
} 

Die statischen Initialisierer (der static { Block) läuft nur einmal, wenn die Klasse wird geladen, so dass Sie alle Wörter nur einmalig in die Set laden können, wenn die Klasse geladen ist.


Sie können dann mit der Set wie so:

if (lowerCaseWords.contains(candidateWord.toLowerCase()) { 
    // Is a word 
} else { 
    // Isn't a word 
}