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

Java 我应该使用哪个数据结构从CSV中搜索字符串?,java,csv,data-structures,arraylist,Java,Csv,Data Structures,Arraylist,我有一个csv文件,有将近200000行,包含两列-名称和作业。然后用户输入一个名称,比如user_name,我必须搜索整个csv以找到包含模式user_name的名称,最后将输出打印到屏幕上。我已经在Java中使用ArrayList实现了这一点,我将从csv到ArrayList的整个名称放在其中,然后在其中搜索模式。但在这种情况下,搜索的总时间复杂度为O(n)。Java中是否有其他数据结构可用于在o(logn)中执行搜索,或者比ArrayList更高效的东西?顺便说一下,我不能使用任何数据库方

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

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

您可以使用:

  • TreeMap
    ,它是经过排序的红黑树

如果无法使用商业数据库,则必须编写代码来模拟数据库的某些功能

要在O(n)时间内按顺序搜索整个数据集,只需读取并搜索每一行即可。如果您编写一个程序,将数据加载到内存映射中,您可以在摊销的O(1)时间内搜索映射,但每次仍会将其加载到内存中,这是一个O(n)操作,不会得到任何结果

因此,下一种方法是构建一个基于磁盘的索引,您可以在不读取整个文件的情况下高效地进行搜索,然后使用该索引告诉您所需记录的位置。这可能是O(logn),但现在您正处于非常复杂的状态,需要构建、维护和管理基于磁盘的索引。这就是数据库系统优化的目的

如果有2亿行,那么唯一可行的解决方案就是使用数据库。对于20万行,我的建议是每次只扫描文件(即使用grep,或者如果不可用,则编写一个简单的程序来执行类似操作)

顺便说一句,如果您提到查找“模式”意味着您需要搜索正则表达式,那么每次都必须扫描整个文件,因为不知道模式就无法构建索引


总之:使用grep

将CSV数据导入数据库(带索引)。然后查询。有用于搜索精确匹配的数据结构,但是查找模式通常是一个
O(n)
时间。哦,我错过了关于“搜索模式”的部分。这到底是什么图案?正则表达式模式?子串匹配?我想还有更多你没有告诉我们的。ArrayList是O(1),所以你不会找到更有效的东西。@Mike'Pomax'Kamermans先生,我不能使用数据库方法。当然,可以建立一个适合正则表达式的索引。记得吗?好吧,这是可能的。我认为OP没有那么复杂。先生,那么在从csv读取名称列的每个元素时执行模式搜索是否比先将其存储在ArrayList中,然后在ArrayList上执行搜索更可行?这没有什么区别。您正在双向读取整个文件。如果你想对每一行进行额外的处理,那么将文件加载到内存中,或者只加载匹配的行是有意义的。先生,这是我第一次听说TreeMap。我会查出来的。@ClumsyBaka因为你是按尾端匹配搜索的,所以你可以将反向名称存储为树形图的键,搜索时你搜索反向键,使用二进制搜索,找到2个边界
>键和
,2个边界之间的就是匹配的。谢谢先生。这真的奏效了。这就是我所做的-从csv读取名称,并将名称的倒数作为键和原始名称作为值存储到TreeMap,根据用户输入的倒数形式创建子映射,最后在子映射中打印键的值。我现在可以在O(log n)中完成搜索。@ClumsyBaka也许你不需要2个地图,你可以使用1个地图,键是反向的名称,值是用户输入,搜索时,你只需反向搜索键。先生,问题是用户输入并不总是与搜索键在所有情况下的反向相同。假设csv包含son、jackson、robert等。现在当用户输入“son”时,我需要显示son、jackson等,其中son是最后一部分。如果我不创建submap,你能告诉我如何实现这一点吗?