我正在使用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();
}
}
这就是我想象中发生的事情:
打印一个单词及其每个同义词,然后从数据结构中删除这些同义词,这样我们就没有重复的行。
问题当然是我在迭代hashmap的内容时无法删除任何内容。
我缺少任何其他方法吗?
P.S。我只保留“图形”比喻,因为我需要标题是雄辩和娴熟的。我知道这个比喻的用处有限。
答案 0 :(得分:2)
您可以存储在Set中打印的单词,然后只处理尚未包含在单词中的单词。
侧面评论:尽管人们可以将此视为图形问题,但您的代码并未将此视为此问题。如果我们将此视为图形问题,那么我们就不会假设每个单词都在相应的ArrayList
中列出了所有同义词,因此需要计算对称和传递闭包。只有这样我们才能提取等价类。
(实际上同义词关系不是传递性的,我知道。)
答案 1 :(得分:0)
我不这样做(你的一般想法)将起作用,因为“同步”不是传递属性。
有很多单词的同义词本身并不是同义词。
答案 2 :(得分:0)
不是删除项目,而是将其添加到要忽略的项目列表中。