Вопрос

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

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

Другие советы

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

Существует множество слов, у которых есть синонимы, которые сами по себе синонимами не являются.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top