2010-08-01 58 views
6

我的老師給了我一份英語詞彙作業。使用Java中的巨大文本文件

選擇一個隨機字母,說「一」 從字母寫一個字,說 「蘋果」以硬道理「E」而寫E中 一句話,說大象現在從「T」 依此類推。不允許重複

請列出500個單詞。 將清單郵寄給老師。 :)

所以不是自己做,我正在研究一個Java代碼,它會爲我做我的作業。代碼似乎很簡單。

算法的核心: 從字典中挑選一個滿足要求的隨機單詞。尋找()與RandomAccessFile。嘗試把它放在一個訂購集(也許LinkedHashSet)

但問題是300000 + enteries的字典龐大的大小。 :| 蠻力隨機算法不會工作。

什麼是最好,最快,最有效的出路?

****更新:**現在我已經編寫了代碼及其工作。我如何使它高效,以便它選擇常用詞彙? 含有約?? **

+0

僅供參考:1十萬= 100000 – miku 2010-08-01 08:28:36

+0

非常瞭解它。文本文件是4MB! – 2010-08-01 08:38:52

+1

4MB很小,不是嗎? – miku 2010-08-01 08:50:43

回答

4

無論是常用詞表中的任何文本文件查找的數據結構,讓您保持一個緊湊詞典在內存中,或簡單地給你的過程更多的內存。三十萬字不是那麼多。

+0

然後使用Java字典容器(例如)hashmap來放置你的字典文件:p(我讀它就像他總是從文件中尋找)。 – KillianDS 2010-08-01 08:44:27

+0

我總是從文件尋找到現在。 :| – 2010-08-01 08:48:51

+2

@Myth,不要 - 只要將它讀入HashMap並使用它即可。 – 2010-08-01 08:59:26

0

我認爲這樣做的方法可能是使用TreeSet,您可以在其中放入所有字典,然後使用方法subSet來檢索所需字母開頭的所有單詞,並對子集執行隨機操作。

但在我看來,由於數據量的原因,最好的辦法是使用SQL請求而不是Java來使用數據庫。

-1

的目標是提高你的英語詞彙 - 不增加計算機的英語詞彙。

如果你不同意這個目標,你爲什麼(或你的父母)支付學費?

+2

它是一個例行的大學作業。我對我的英語很有信心。可以輕鬆完成。爲它編寫代碼將會學到一些東西。 :) – 2010-08-01 09:18:22

+1

這是一個如此愚蠢的任務,作弊不僅被允許 - 建議。我會返回一份500褻瀆的名單,以清楚表達我的觀點。 – 2010-08-01 10:26:42

+0

我同意Myth17,聽起來像是打盹。 – 2010-08-01 10:27:06

0

如果我這樣做:

class LoadWords { 
    public static void main(String... args) { 
    try { 
     Scanner s = new Scanner(new File("/usr/share/dict/words")); 
     ArrayList<String> ss = new ArrayList<String>(); 
     while (s.hasNextLine()) 
     ss.add(s.nextLine()); 
     System.out.format("Read %d words\n", ss.size()); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(System.err); 
    } 
    } 
} 

我可以java -mx16m LoadWords,這限制了Java堆大小爲16 MB,這是不是Java中的內存運行它。我的/usr/share/dict/words文件中有大約250,000個字,所以它可能會比你的小一些。

您需要使用與我已使用的簡單ArrayList<String>不同的數據結構。也許是ArrayList<String>的一個HashMap,關鍵字的開頭字母將是一個很好的開始選擇。

1

希望這不會讓你掃興或東西,但如果我是你,我會採取這種做法..

僞的java:

abstract class Word { 
    String word; 
    char last(); 
    char first();   
} 

abstract class DynamicDictionary { 
    Map<Character,Set<Word>> first_indexed; 

    Word removeNext(Word word){ 
     Set<Word> candidates = first_indexed.get(word.last()); 
     return removeRandom(candidates); 
    } 

    /** 
    * Remove a random word out from the entire dic. 
    */ 
    Word removeRandom(); 

    /** 
    * Remove and return a random word out from the set provided. 
    */ 
    Word removeRandom(Set<Word> wordset);  
} 

然後

Word primer = dynamicDictionary.removeRandom(); 
List<Word> list = new ArrayList<Word>(500); 
list.add(primer); 
for(int i=0, Word cur = primer;i<499;i++){ 
    cur = dynamicDictionary.removeNext(cur); 
    list.add(cur); 
} 

注意:不打算被視爲真正的java代碼,只是粗略地解釋方法的一種方式(沒有錯誤處理,如果真的被使用,沒有良好的類結構等等)。

我應該遇到內存問題,也許我會做到這一點:

abstract class Word { 
    int lineNumber; 
    char last(); 
    char first(); 
} 

如果這還不夠,想我會使用該文件的二進制搜索或把它放在一個DB等。