2009-05-18 8 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(); 
    } 
} 

これは私が起こるためにそれを描いた方法です:

たちは重複行を持っていないので、データ構造から、これらのシノニムを削除し、その後、その同義語のそれぞれと一緒に単語を印刷します。

問題はもちろん、私がハッシュマップの内容を反復している間は何も削除できません。

いずれの代替方法もありませんか?

P.S.私は雄弁と甘味になるためにタイトルが必要だったので、私は「グラフ」のメタファーを維持しています。このメタファーは有用性には限界があることを理解しています。

+0

この問題はマップの縮小に適しています(今すぐ参考になることはありません) – Adrian

答えて

2

Setに印刷された単語を保存して、まだ設定されていない単語だけを処理できます。

サイドレック:これはグラフの問題として考えることができますが、あなたのコードではこのように扱われません。これをグラフの問題として扱うならば、各単語が対応するArrayListにリストされたすべての同義語を持っていると仮定しないで、対称および推移的閉包の計算を要求する。それでは、等価クラスを抽出します。

(実際には同義語関係は、私が知っている、推移的ではありません。)

+0

私はこの区別を理解しています。そうです、シソーラスのモデルは1種類のグラフだけを表しており、それぞれの接続されたコンポーネントは完全なグラフです。 – Dan

0

「synonimityは」推移プロパティではありませんように私はこの本(あなたの一般的な考え方)が動作しますしません。

シノニムと同義でない言葉がたくさんあります。

+1

宿題が割り当てられているので、これは要件を簡単にするための要件の一部です。 – Dan

0

アイテムを削除する代わりに、無視するアイテムのリストにアイテムを追加します。

関連する問題