Pergunta

Eu estou construindo um dicionário usando uma HashMap <String,ArrayList<String>> às palavras segurar e seus sinônimos (esta estrutura de dados é necessária).

Para efeitos da atribuição, a relação sinonímia é considerado transitivo. (Podemos imaginar o dicionário de sinônimos como um gráfico). O que eu estou tentando fazer é imprimir este gráfico em um arquivo de texto, com um componente conectado em cada linha. Em outras palavras, todas as palavras que podem ser agrupados em conjunto como sinônimos deve ir em uma única linha.

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();
    }
}

Isto é como eu imaginei que isso aconteça:

Imprimir uma palavra junto com cada um de seus sinônimos, em seguida, retire a estes sinónimos da estrutura de dados de modo que não têm linhas duplicadas.

O problema é claro que eu posso qualquer coisa não de exclusão, enquanto eu estou interagindo sobre o conteúdo do hashmap.

Qualquer abordagens alternativas que estou perdendo?

P.S. Estou mantendo a metáfora 'gráfico' todo só porque eu precisava do título ser eloqüente e sucinta. Eu entendo que esta metáfora é limitado em utilidade.

Foi útil?

Solução

Você pode armazenar as palavras que foram impressas em uma Set , e só então lidar com palavras que ainda não estão no conjunto.

observação Side : embora seja verdade que se pode pensar sobre isso como um problema gráfico, seu código não tratar isso como tal. Se estivéssemos a tratar isso como um problema gráfico, então não faria a suposição de que cada palavra tem todos os seus sinónimos constantes na ArrayList correspondente, chamando, assim, para o cálculo do encerramento simétrica e transitiva. Só então podemos extrair as classes de equivalência.

(Na realidade, a relação sinônimo não é transitivo, eu sei.)

Outras dicas

Eu não este este (a sua ideia geral) vai funcionar como "synonimity" não é uma propriedade transitiva.

Há uma abundância de palavras que têm sinônimos que não são eles próprios sinônimos.

Em vez de remover o item, adicioná-lo a uma lista de itens para ignorar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top