2016-04-24 11 views
5

Ich versuche, ein Boggle-Spiel in Java zu machen, und für mein Programm, sobald ich das Board randomize Ich habe eine Methode, die durch die möglichen Kombinationen iteriert und vergleicht jedes mit einem Wörterbuchliste, um zu überprüfen, ob es ein gültiges Wort ist, und wenn ja, lege ich es in den Schlüssel. Es funktioniert gut, jedoch benötigt das Programm drei oder vier Minuten, um den Schlüssel zu generieren, was hauptsächlich auf die Größe des Wörterbuchs zurückzuführen ist. Der, den ich benutze, hat ungefähr 19.000 Wörter und der Vergleich jeder Kombination dauert eine Menge Zeit. Hier ist der Teil des Codes Ich versuche, schneller zu machen:Iterate durch nur einen Teil einer großen Liste in Java

if (str.length()>3&&!key.contains(str)&&prefixes.contains(str.substring(0,3))&&dictionary.contains(str)){ 
     key.add(str); 
    } 

wo str wird die Kombination erzeugt. prefixes ist eine Liste, die ich auf dictionary erzeugt basiert, das so geht:

public void buildPrefixes(){ 
    for (String word:dictionary){ 
     if(!prefixes.contains(word.substring(0,3))){ 
      prefixes.add(word.substring(0,3)); 
     } 
    }  
} 

, die alle drei Buchstaben-Präfixen im Wörterbuch kommt noch hinzu, wie „abb“ und „mar“, so dass, wenn str ist jibberish wie „xskfjh "Es wird nicht gegen das ganze Wörterbuch geprüft, nur prefixes was so etwas wie 1k Worte ist.

Was ich versuche nur eine Näherung durch Iteration durch die Wörter im Wörterbuch auf Zeit abgeholzt zu tun ist, die den gleichen Anfangsbuchstaben wie str haben, also wenn str ist „Abtei“ dann wird es nur str gegen Worte Sie sicher, dass Beginnen Sie mit "a" anstatt der ganzen Liste, was die Zeit erheblich verkürzen würde. Oder noch besser, es prüft nur str gegen Wörter, die das gleiche Präfix haben. Ich bin ziemlich neu in Java, also würde ich wirklich schätzen, wenn Sie in Ihren Antworten sehr beschreibend sind, danke!

+0

Sieht so aus, als könnten Sie eine Karte > oder etwas in dieser Richtung verwenden. Dies teilt Ihre Suche in 26 Stücke und beschleunigt die Suche etwas. Aber was Sie wahrscheinlich suchen, ist eine Möglichkeit, effizient ein Diagramm zu erstellen und zu durchsuchen. –

+0

Gefunden beim googeln ... http://www.wutka.com/dawg.html Interessante Sachen –

+1

Sie versuchen, ein Trie neu zu erfinden – AdamSkywalker

Antwort

2

Was Kommentare zu sagen versuchen ist - Rad nicht neu erfinden. Java ist nicht Assembler oder C und es ist mächtig genug, um solche trivialen Fälle zu behandeln. ist hier einfacher Code, der zeigt, dass einfache Set Ihren Wortschatz einfach handhaben kann:

import java.util.Set; 
import java.util.TreeSet; 

public class Work { 

    public static void main(String[] args) { 
     long startTime=System.currentTimeMillis(); 
     Set<String> allWords=new TreeSet<String>(); 
     for (int i=0; i<20000;i++){ 
      allWords.add(getRandomWord()); 
     } 
     System.out.println("Total words "+allWords.size()+" in "+(System.currentTimeMillis()-startTime)+" milliseconds"); 

    } 

    static String getRandomWord() { 
     int length=3+(int)(Math.random()*10); 
     String r = ""; 
     for(int i = 0; i < length; i++) { 
      r += (char)(Math.random() * 26 + 97); 
     } 
     return r; 
    } 
} 

Auf meinem Computer zeigt es

Total words 19875 in 47 milliseconds 

Wie Sie 125 Wörter sehen aus 20.000 dupliziert wurden. Und es hat nicht nur Zeit gebraucht, 20.000 Wörter auf sehr ineffiziente Weise zu generieren, sondern sie auch zu speichern und nach Duplikaten zu suchen.