【问题标题】:Best method for search into file搜索文件的最佳方法
【发布时间】:2015-12-09 18:49:07
【问题描述】:

我有一个文件,其文本如下:

4 abiogenezele
5 abiogenezelor
6 acefaliile
7 acefaliilor
8 acetonuriile
....

它的格式为 (ID_WORD WORD) 并有一个近似值。约 33000 字。

我想输入一个词来找到他的ID。

我试试这个代码。它有效,但效率不高。

int ID;
String word = "acefaliile";
String pattern = "(?i)([\\d]+) ("+word+")";
Pattern r = Pattern.compile(pattern);
boolean found = false;

// Read the file
try (BufferedReader br = new BufferedReader(new FileReader("./resources/txt/lemma.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        Matcher m = r.matcher(line);

        if (m.find( )) {
            // m.group(1) is ID
            // m.group(2) is WORD
            ID = Integer.parseInt(m.group(1));
            found=true;
            break;
        }
    }

    if(!found) {
        ID = 0;
    }
}

【问题讨论】:

  • 使用数据库,sqlite 之类的可能比较理想。或者只是将它们加载到内存中。
  • 将文件加载到内存并执行二分查找。

标签: java algorithm file search


【解决方案1】:
  • 将文件加载到内存中。
  • 用空格分隔行(第一个空格,如果 'words' 可以包含空格)
  • 将数据加载到映射(字典)数据结构(Java 中的 HashMap?)中,以 word 为键,id 为值。
  • 在此地图中进行搜索。

另一种方式 - 将这些键/值对放入数组或列表中,对其进行排序,然后使用二分查找。

【讨论】:

  • 不占内存?有33,000行
  • 它占用的内存不到 1 兆字节(取决于总字长),但将搜索速度提高了一百倍
  • 对于您的“替代方式”,我认为排序是不必要的。从@AdrianSimionescu 发布的 5 行来看,这些单词似乎已经按字母顺序排序。
  • @Jeff Irwin 是的,您几乎可以肯定是对的,但尚未明确声明。
【解决方案2】:

您可以将 Lookeen 用作file search 程序!此工具会自动搜索文件内容,并且您有很多过滤选项。

免责声明:我为 Lookeen 的开发人员工作。

【讨论】: