Найдите "связанные компоненты" на графике
-
22-08-2019 - |
Вопрос
Я создаю тезаурус, используя 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.Я сохраняю метафору "графика" повсюду только потому, что мне нужно было, чтобы название было красноречивым и емким.Я понимаю, что полезность этой метафоры ограничена.
Решение
Вы можете сохранить слова, которые были напечатаны в Установить, а затем обрабатывать только те слова, которых еще нет в наборе.
Боковое замечание:хотя это правда, что об этом можно думать как о проблеме с графом, ваш код не рассматривает это как таковое.Если бы мы рассматривали это как проблему с графом, то мы бы не делали предположения, что каждое слово имеет все свои синонимы, перечисленные в соответствующем ArrayList
, таким образом, требуя вычисления симметричного и транзитивного замыкания.Только тогда мы могли бы извлечь классы эквивалентности.
(На самом деле отношение синонимов не является переходным, я знаю.)
Другие советы
Я не думаю, что это (ваша общая идея) сработает, поскольку "синонимичность" не является транзитивным свойством.
Существует множество слов, у которых есть синонимы, которые сами по себе синонимами не являются.
Вместо удаления элемента добавьте его в список элементов, которые следует игнорировать.