Question

Je construis un thésaurus en utilisant un HashMap <String,ArrayList<String>> pour contenir les mots et leurs synonymes (cette structure de données est nécessaire).

Aux fins de la cession, la relation de synonymie est considéré comme transitive. (On peut imaginer le thésaurus sous forme de graphique). Ce que je suis en train d'accomplir est d'imprimer ce graphique dans un fichier texte, avec un composant connecté sur chaque ligne. En d'autres termes, tous les mots qui peuvent être mises en commun ensemble comme synonymes devraient aller sur une seule ligne.

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

Voilà comment je représentais que cela se produise:

Imprimer un mot avec chacun de ses synonymes, puis retirez les synonymes de la structure de données afin que nous n'avons pas les lignes en double.

Le problème est bien sûr que je ne peux pas supprimer quoi que ce soit alors que je suis itérer sur le contenu du hashmap.

Les approches que je suis absent?

P.S. Je garde la métaphore graphique »tout au long de seulement parce que je devais le titre éloquent et succint. Je comprends que cette métaphore est d'une utilité limitée.

Était-ce utile?

La solution

Vous pouvez stocker les mots qui ont été imprimées dans un set , et seulement gérer les mots qui ne sont pas encore dans le jeu.

remarque Side : mais il est vrai que l'on peut penser à cela comme un problème graphique, votre code ne traite pas comme tel. Si nous devions traiter cela comme un problème graphique, alors nous ne faisons l'hypothèse que chaque mot a tous ses synonymes figurant dans le ArrayList correspondant, appelant ainsi pour le calcul de la fermeture symétrique et transitive. Alors seulement, nous extraire les classes d'équivalence.

(En réalité, la relation est synonyme transitive pas, je sais.)

Autres conseils

Je ne pas cela (votre idée générale) fonctionnera comme « synonymie » est pas une propriété transitive.

Il y a beaucoup de mots qui ont des synonymes qui ne sont pas eux-mêmes synonymes.

Au lieu d'enlever l'élément, l'ajouter à une liste d'éléments à ignorer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top