在图中查找“连接的组件”

问题描述:

我正在使用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

您可以存储打印在Set中的单词,然后仅处理尚未在该集合中的单词。

备注:尽管确实可以将此视为图形问题,但您的代码并不会将此视为这样。如果我们将这视为一个图形问题,那么我们就不会假设每个单词都具有在对应的ArrayList中列出的所有同义词,因此需要计算对称和传递闭包。只有这样我们才能提取等价类。

(在现实中的同义词关系是不可传递的,我知道。)

+0

我明白这个区别。你是对的,同义词库的模型只代表一种图形,其中每个连接的组件都是完整的图形。 – Dan 2009-05-18 22:53:02

我没有这个这个(你的总体思路)将作为“synonimity”不是过渡性质。

有很多单词具有不同义的同义词。

+1

作为一项家庭作业,这是要求的一部分,以保持简单。 – Dan 2009-05-18 22:46:42

不是删除项目,而是将其添加到要忽略的项目列表。