我应该使用哪种数据结构从CSV中搜索字符串?

时间:2014-07-25 03:18:49

标签: java csv data-structures arraylist

我有一个包含两列的近200000行的csv文件 - name&工作。然后用户输入一个名称,比如user_name,我必须搜索整个csv以查找包含模式user_name的名称,最后将输出打印到屏幕。我已经使用Java中的ArrayList实现了这一点,我将整个名称从csv放到ArrayList中,然后在其中搜索模式。但在这种情况下,搜索的总时间复杂度为O(n)。 Java中是否有任何其他数据结构可用于执行o(logn)搜索或比ArrayList更高效的搜索?顺便说一句,我不能使用任何数据库方法。如果我可以用任何其他语言建立一个良好的数据结构来实现我的目标,那么请向我建议吗?

编辑 - 输出应该是csv中包含模式user_name作为最后一部分的名称。例如:如果我的输入是“儿子”,那么它应该返回“杰克逊”等。到目前为止我所做的是将csv的name列读取到字符串ArrayList,然后读取ArrayList的每个元素并使用正则表达式(Java的模式匹配器)来查看该元素是否具有user_name作为最后一部分。如果是,则打印出来。如果我在多线程环境中实现它,它会增加我的程序的可伸缩性和性能吗?

2 个答案:

答案 0 :(得分:0)

您可以使用:

  • TreeMap,它是红黑树排序,

答案 1 :(得分:0)

如果您无法使用商业数据库,那么您将不得不编写代码来模仿某些数据库的功能。

要在 O(n)时间内按顺序搜索整个数据集,您只需阅读它并搜索每一行。如果你编写一个程序将数据加载到内存映射中,你可以在分摊的 O(1)时间内搜索Map,但是你每次都要将它加载到内存中,这是 O(n)操作,无需任何操作。

因此,接下来的方法是构建某种基于磁盘的索引,您可以在不读取整个文件的情况下高效搜索,然后使用索引告诉您所需记录的位置。这将是 O(log n),但现在您处于极其复杂的状态,构建,维护和管理基于磁盘的索引。这就是数据库系统优化的目的。

如果您有200万行,那么唯一可行的解​​决方案就是使用数据库。对于200 THOUSAND行,我的建议是每次只扫描文件(即使用grep或者如果不可用则写一个简单的程序来做类似的事情)。

顺便说一下,如果你想找到一个“模式”意味着你需要搜索一个正则表达式,那么每次都必须扫描整个文件,因为你不知道你不能建立索引的模式。

总结:使用grep

相关问题