2009-05-18 90 views
0

我正在使用HashMap <String,ArrayList<String>>構建一個同義詞庫來保存單詞及其同義詞(需要此數據結構)。在圖中查找「連接的組件」

爲了賦值的目的,同義關係被認爲是可傳遞的。 (我們可以將詞庫想象成一個圖)。 我試圖完成的是在一個文本文件中打印這個圖形,並在每一行上連接一個組件。換句話說,所有可以彙集在一起​​的單詞都應該放在一行上。

public void save() { 
    try { 
     FileWriter fw = new FileWriter(defaultDefinitionFile); 
     BufferedWriter out = new BufferedWriter(fw); 
     Set<String> keys = thesaurus.keySet(); 
     Iterator<String> ite = keys.iterator(); 
     while (ite.hasNext()) { 
      String key = ite.next(); 
      out.write(key); 
      ArrayList<String> synonyms = thesaurus.get(key); 
      Iterator<String> i = synonyms.iterator(); 
      while (i.hasNext()) { 
       String syn = i.next(); 
       out.write(","+syn); 
       keys.remove(syn); 
      } 
      out.write("\r\n"); 
     } 
     out.close(); 
     fw.close(); 
    } 
    catch (Exception e) { 
     System.out.println("Error writing to file"); 
     e.printStackTrace(); 
    } 
} 

這是我想象這樣的情況發生:

打印Word與它的每一個同義詞一起,然後從數據結構中刪除這些同義詞,所以我們沒有重複的線路。

問題是當我迭代hashmap的內容時,我無法刪除任何東西。

我失蹤的任何替代方法?

P.S.我始終只保留'圖表'的隱喻,因爲我需要這個頭銜的口才和口才。我知道這個比喻在實用性方面有限。

+0

這個問題適合地圖縮小(現在找不到一個好的參考) – Adrian 2011-12-17 02:57:09

回答

2

您可以存儲打印在Set中的單詞,然後僅處理尚未在該集合中的單詞。

備註:儘管確實可以將此視爲圖形問題,但您的代碼並不會將此視爲這樣。如果我們將這視爲一個圖形問題,那麼我們就不會假設每個單詞都具有在對應的ArrayList中列出的所有同義詞,因此需要計算對稱和傳遞閉包。只有這樣我們才能提取等價類。

(在現實中的同義詞關係是不可傳遞的,我知道。)

+0

我明白這個區別。你是對的,同義詞庫的模型只代表一種圖形,其中每個連接的組件都是完整的圖形。 – Dan 2009-05-18 22:53:02

0

我沒有這個這個(你的總體思路)將作爲「synonimity」不是過渡性質。

有很多單詞具有不同義的同義詞。

+1

作爲一項家庭作業,這是要求的一部分,以保持簡單。 – Dan 2009-05-18 22:46:42

0

不是刪除項目,而是將其添加到要忽略的項目列表。