【问题标题】:Tree in java to store words from a textjava中的树来存储文本中的单词
【发布时间】:2010-01-11 20:09:55
【问题描述】:

我有一个文本文件,其中每一行都是单词字符串 word1/word2/.../wordn 的路径,我想查询该文件。我需要构建一棵树,将单词和文件的每一行存储为路径,以便每当我搜索单词时,我都会得到单词节点和该单词所属的所有路径。我想知道 java 中是否有内置的树/图相关库,或者是否有适合当前问题的特定树结构。实际上,我的基本想法是构建一棵树,以便我逐行读取文件并将节点和行路径添加到该树。有什么想法建议吗?

【问题讨论】:

  • 一个词节点可以在不同行的两个不同层次吗?示例 - 第 1 行:foo/bar,第2 行:baz/foo/qux。这里 foo 是第 1 行的根,但在第 2 行的第二层。
  • 可以。因此,在这种情况下,输出应该是:关键字:“foo”(或“f”、“fo”等..)路径:foo -> bar baz -> foo -> qux

标签: java data-structures tree graph


【解决方案1】:

我将研究将文件存储在 XML 文档中并使用 XPath 进行搜索。 Xerces 是一个好的开始。文件的每个部分 (word1/) 都是一个节点,后面的单词 (word2) 是一个子节点。

【讨论】:

    【解决方案2】:

    我将构建一个包含一个单词和包含该单词的行集的类。

    在遍历文件的行时,保留一个映射(java.util.HashMap 或 java.util.TreeMap,取决于您以后需要如何使用它),其中单词(字符串)作为键,上面的类作为值。对于一行中的每个单词,在字典中查找它,并将该行添加到其条目中(如果还没有,则添加一个新条目)。

    在扫描文件后查找单词出现的行是一个简单的地图查找。

    【讨论】:

      【解决方案3】:

      你所拥有的根本不是一棵树。我会使用Map<String, List<String>> 来存储包含每个单词的行列表。这使用 O(n) 内存并具有快速查找。示例代码:

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

      【讨论】:

        【解决方案4】:

        我的第一个虽然类似于 Liedman,但略有不同:与其为线条创建新类,不如使用 Set&lt;String&gt; (HashSet&lt;String&gt;) 或 List&lt;String&gt; (ArrayList&lt;String&gt;)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-07
          • 1970-01-01
          • 1970-01-01
          • 2016-06-11
          相关资源
          最近更新 更多