3

我有一个包含数据字段条目的文件(dictionary.txt),如下所示 -

    ABC This represents ...
    PQR This represents ...
    XYZ This represents ...
    ...
    ...
    ... (hundreds of such entries)

我有一个名为 Searcher.java 的 Java 程序,它具有以下功能

private String[] searchInsideFile(String stringToMatch, String fileName)

这将查找文件中包含在 stringToMatch 中的任何数据字段的出现。然而,就目前而言,该函数每次都会打开和关闭文件,并读取其所有数百个字段以查找匹配项。

我将不得不多次调用这个函数(可能数百次),因此,我认为我所做的不是很有效。这种情况有没有好的“设计模式”?谢谢。

4

5 回答 5

3

如果可能,您应该在内存中预加载文件的全部内容,并使用定义为属性的某些数据结构对其进行索引,可能是Map与要匹配的字符串键控。然后该方法searchInsideFile应该查看数据结构内部并避免完全加载文件。

于 2012-04-04T14:05:11.670 回答
2

最快的解决方案是读取文件一次并将其保存在内存中。但这只有在文件不是很大的情况下才有用。如果文件太大或将来可能变得太大,您必须每次从磁盘读取它,因为您必须搜索整个文件。在这种情况下,随机访问并不能真正帮助您。

于 2012-04-04T14:05:28.517 回答
1

如果文件不是太大并且不会更改,您可以在启动时将其内容读取为字符串,然后在其上进行搜索

于 2012-04-04T14:15:25.507 回答
1

我会使用 ConstantDataManager 模式。基本思想是,当您启动程序时,将产生开销,因为对象会从您正在使用的文件中提取所有信息作为向量,或者您想要存储它(地图等)。

然后您可以对数据存储进行二进制搜索(假设您的字典按顺序存储单词),如果您愿意,您可能还希望在对象中有一个 save 方法来将任何内容更新到文件中。

一本值得一看的好书是“Java 中的软件架构设计模式 - Partha Kuchana” 这是本书相关章节的链接,尽管您必须付费才能看到 72 小时或从他们那里购买。您可能可以从任何图书馆或其他来源获得它... http://www.crcnetbase.com/doi/pdf/10.1201/9780203496213.ch7

您是否还考虑过使用 MYSQL 数据库,如果您的字典有很多条目,这可能会更快一些?

希望这会有所帮助,-Ben

于 2012-04-04T14:33:42.550 回答
0

也许将 Searcher 类中的文件作为实例变量,然后创建一个单独的函数来打开文件。然后更改 searchInsideFile() 函数以访问之前已经打开的文件。记得之后关闭文件!

于 2012-04-04T14:05:02.433 回答