J'ai un fichier texte où chaque ligne est un chemin de chaînes de mots word1/word2 /.../ wordn et je veux interroger le fichier. J'ai besoin de construire un arbre qui stocke les mots et chaque ligne du fichier comme un chemin de sorte que chaque fois que je cherche un mot, j'obtiens le mot-nœud et tous les chemins auxquels ce mot appartient. Je me demandais s'il y avait une bibliothèque liée à l'arbre/graphe intégré dans java ou s'il y avait une arborescence particulière appropriée que je pourrais utiliser pour le problème actuel. En fait, mon idée de base est de construire un arbre afin que je lise le fichier par ligne et ajoute les noeuds et le chemin de ligne à cet arbre. Des idées-suggestions?Arbre en Java pour stocker des mots à partir d'un texte
Répondre
Je chercherais à stocker le fichier dans un document XML et à utiliser XPath pour le rechercher. Xerces est un bon début. Chaque partie du fichier (word1 /) serait un nœud avec les mots suivants (word2) en tant qu'enfant.
Je voudrais construire une classe qui contient un mot et l'ensemble des lignes qui contiennent ce mot.
Lorsque vous parcourez les lignes du fichier, conservez une carte (java.util.HashMap ou java.util.TreeMap, en fonction de la façon dont vous devez l'utiliser ultérieurement) avec des mots (Strings) comme clés et la classe ci-dessus comme valeurs . Pour chaque mot sur une ligne, recherchez-le dans le dictionnaire, et ajoutez la ligne à son entrée (ou ajoutez une nouvelle entrée si elle n'est pas déjà là).
La recherche des lignes dans lesquelles le mot apparaît est une recherche de carte simple après avoir analysé le fichier.
Mon premier est bien semblable à Liedman de, mais un peu différent: Plutôt que de créer une nouvelle classe pour les lignes, il suffit d'utiliser un Set<String>
(HashSet<String>
) ou List<String>
(ArrayList<String>
).
Ce que vous avez n'est pas vraiment un arbre du tout. Je voudrais utiliser un Map<String, List<String>>
pour stocker la liste des lignes qui contient chaque mot. Cela utilise la mémoire O (n) et a une recherche rapide. Exemple de code:
import java.util.*;
import java.io.*;
public class WordNodes
{
Map<String, List<String>> map = new HashMap<String, List<String>>();
void readInputFile(String filename) throws IOException, FileNotFoundException
{
FileReader fileReader = new FileReader(filename);
BufferedReader bufferedReader = new BufferedReader(fileReader);
try
{
List<String> lines = new ArrayList<String>();
String line = null;
while ((line = bufferedReader.readLine()) != null)
{
for (String word: line.split("/"))
{
List<String> list = map.get(word);
if (list == null)
{
list = new ArrayList<String>();
map.put(word, list);
}
list.add(line);
}
}
} finally {
bufferedReader.close();
}
}
void run() throws IOException, FileNotFoundException
{
readInputFile("file.txt");
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
try
{
while (true)
{
String word = bufferedReader.readLine();
List<String> lines = map.get(word);
if (lines == null)
{
System.out.println("Word not found.");
}
else
{
for (String line: lines)
{
System.out.println(line);
}
}
}
} finally {
bufferedReader.close();
}
}
public static void main(String[] args) throws Exception
{
new WordNodes().run();
}
}
Un nœud de mots peut-il être à deux niveaux différents sur des lignes différentes? Exemple - ligne1: foo/bar, ligne2: baz/foo/qux. Ici, foo est la racine de la ligne 1, mais le deuxième niveau de la ligne 2. –
Oui, c'est possible. Donc, dans un cas comme ça, la sortie devrait être: mot-clé: "foo" (ou "f", "fo" et ainsi de suite ..) chemin (s): foo -> bar baz -> foo -> qux – Galois