2009-05-18 10 views
0

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

+0

эта проблема подходит для уменьшения карты (не могу найти хорошую ссылку для нее прямо сейчас) – Adrian

ответ

2

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

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

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

+0

Я понимаю это различие. Вы правы, модель тезауруса представляет собой только один вид графика, в котором каждый подключенный компонент является полным графиком. – Dan

0

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

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

+1

Будучи заданием на домашнее задание, это часть требования, чтобы упростить вещи. – Dan

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^