Найти «связанные компоненты» на графике - PullRequest
0 голосов
/ 19 мая 2009

Я строю тезаурус, используя 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. Я сохраняю метафору «графа» только потому, что мне нужно, чтобы заголовок был красноречивым и лаконичным. Я понимаю, что эта метафора ограничена в полезности.

Ответы [ 3 ]

2 голосов
/ 19 мая 2009

Вы можете сохранить слова, которые были напечатаны в наборе , а затем обрабатывать только те слова, которых еще нет в наборе.

Дополнительное замечание : хотя это правда, что можно думать об этом как о проблеме с графом, ваш код не рассматривает это как таковой. Если бы мы рассматривали это как проблему с графом, мы бы не предполагали, что каждое слово имеет все свои синонимы, перечисленные в соответствующих ArrayList, что требует вычисления симметричного и транзитивного замыкания. Только тогда мы извлечем классы эквивалентности.

(На самом деле отношение синонимов не транзитивно, я знаю.)

0 голосов
/ 19 мая 2009

Вместо удаления предмета добавьте его в список предметов, которые нужно игнорировать.

0 голосов
/ 19 мая 2009

Я не думаю, что это (ваша общая идея) будет работать, так как "синонимность" не является переходным свойством.

Есть много слов, которые имеют синонимы, которые сами по себе не являются синонимами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...