Java 建立字符串索引(包含出现行的子字符串列表)的最快方法? 问题:
本质上,我的目标是从文本文件构建IndexEntry对象的ArrayList。IndexEntry具有以下字段:Stringword,表示文本文件中的唯一单词;ArrayListnumsList,一个包含出现word的文本文件行的列表 我构建的ArrayList必须对索引项进行排序,以便它们的word字段按字母顺序排列。然而,我想以最快的方式做到这一点。目前,我访问文本文件中显示的每个单词,并使用二进制搜索确定该单词的索引是否已经存在,以便将当前行号添加到其numsList。如果IndexEntry不存在,我会在适当的位置创建一个新的IndexEntry,以保持字母顺序 例子: _ 一个 两个 一个 三 _ 将生成索引项的数组列表,其输出为字符串(按word,numsList的顺序),如下所示: 一[1,5],三[7],二[3] 请记住,我使用的是更大的文本文件,同一个单词出现了很多次 问题:Java 建立字符串索引(包含出现行的子字符串列表)的最快方法? 问题:,java,sorting,arraylist,Java,Sorting,Arraylist,本质上,我的目标是从文本文件构建IndexEntry对象的ArrayList。IndexEntry具有以下字段:Stringword,表示文本文件中的唯一单词;ArrayListnumsList,一个包含出现word的文本文件行的列表 我构建的ArrayList必须对索引项进行排序,以便它们的word字段按字母顺序排列。然而,我想以最快的方式做到这一点。目前,我访问文本文件中显示的每个单词,并使用二进制搜索确定该单词的索引是否已经存在,以便将当前行号添加到其numsList。如果IndexEnt
二进制搜索是解决这个问题的最快方法吗?我仍然是Java编程的新手,我很好奇在这种情况下搜索性能更好的算法,或者与我当前的解决方案相比,使用哈希表的相对时间复杂度。您可以尝试树形图或ConcurrentSkipListMap,它将保持索引的排序 但是,如果您只需要在索引结束时使用一个排序列表,那么好的旧HashMap就是一种选择(ArrayList as value可能也是一种安全的选择) 完成后,获取映射的值并按键对它们进行一次排序 应该足够容纳几百兆的文本文件
如果您使用的是Java 8,请使用整洁的
computeifassent
和computeIfPresent
方法。首先尝试使用Map
而不是List
。它将提供恒定的时间查找性能。在构建地图之后,然后将其转换为您的愿望列表。Java已经有了一个这样的类。你需要一张地图
。所有这些都可以优化,直到奶牛回家,但一如既往:先测量,然后优化