Pregunta

Estoy construyendo un tesauro usando un HashMap <String,ArrayList<String>> para contener las palabras y sus sinónimos (se requiere esta estructura de datos).

Para el propósito de la asignación, la relación sinonimia se considera transitiva. (Podemos imaginar el tesauro como un gráfico). Lo que estoy tratando de lograr es imprimir este gráfico en un archivo de texto, con un componente conectado en cada línea. En otras palabras, todas las palabras que se pueden agrupar juntos como sinónimos deben ir en una sola línea.

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

Esto es como me había imaginado que suceda:

Imprimir una palabra con cada una de sus sinónimos, a continuación, eliminar los sinónimos de la estructura de datos de modo que no tenemos las líneas duplicadas.

El problema es, por supuesto, que no puedo borrar nada mientras estoy interactuando sobre el contenido de la HashMap.

Cualquier enfoques alternativos que me falta?

P.S. Me quedo con la metáfora 'gráfica' a lo largo sólo porque necesitaba el título de ser elocuente y sucinta. Yo entiendo que esta metáfora es limitado en su utilidad.

¿Fue útil?

Solución

Puede almacenar las palabras que se imprimieron en un Establecer , y sólo manejar palabras que no están todavía en el conjunto.

observación lateral : aunque es cierto que uno puede pensar en esto como un problema gráfico, el código no trata esto como tales. Si nos vamos a tratar esto como un problema gráfico, entonces no hacemos la suposición de que cada palabra tiene todos sus sinónimos, que figuran en el ArrayList correspondiente, por lo que exigen el cálculo de la clausura simétrica y transitiva. Sólo entonces podemos extraer las clases de equivalencia.

(En realidad, la relación sinónima no es transitivo, lo sé.)

Otros consejos

No esta presente (su idea general) funcionará como "sinonimia" no es una propiedad transitiva.

Hay un montón de palabras que tienen sinónimos que no sean en sí sinónimos.

En lugar de eliminar el artículo, añadirlo a una lista de elementos a ignorar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top