查找“连接的组件”; 在图中
我正在使用 HashMap
构建同义词库来保存单词及其同义词(需要此数据结构)。
出于分配的目的,同义关系被认为是传递的。 (我们可以将同义词库想象成一张图表)。 我想要完成的是将这个图形打印在文本文件中,每行都有一个连接的组件。 换句话说,所有可以作为同义词汇集在一起的单词都应该放在一行上。
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();
}
}
这就是我想象的情况:
打印一个单词及其每个同义词,然后从数据结构中删除这些同义词,这样我们就不会出现重复的行。
问题当然是,当我迭代哈希图的内容时,我无法删除任何内容。
我缺少任何替代方法吗?
PS:我自始至终都使用“图表”比喻,只是因为我需要标题雄辩且简洁。 我知道这个比喻的用处是有限的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以将打印的单词存储在 Set< /a>,然后仅处理尚未包含在集合中的单词。
旁注:虽然人们确实可以将其视为图形问题,但您的代码不会将其视为这样。 如果我们将其视为图问题,那么我们就不会假设每个单词的所有同义词都列在相应的 ArrayList 中,从而需要计算对称和传递闭包。 只有这样我们才能提取等价类。
(实际上,我知道同义词关系不是传递性的。)
You can store the words that were printed in a Set, and then only handle words that are not yet in the set.
Side remark: though it's true that one can think about this as a graph problem, your code doesn't treat this as such. If we were to treat this as a graph problem, then we wouldn't make the assumption that each word has all its synonyms listed in the corresponding
ArrayList
, thus calling for the calculation of the symmetric and transitive closure. Only then would we extract the equivalence classes.(In reality the synonym relation is not transitive, I know.)
我不认为这个(你的总体想法)会起作用,因为“同义性”不是传递属性。
有很多单词的同义词本身并不是同义词。
I don't this this (your general idea) will work as "synonimity" is not a transitive property.
There are plenty of words that have synonyms that are not themselves synonyms.
不要删除该项目,而是将其添加到要忽略的项目列表中。
Instead of removing the item, add it to a list of items to ignore.