构建String的索引(带有出现行的子字符串列表)的最快方法?

时间:2016-12-29 03:32:36

标签: java sorting arraylist

问题:

基本上,我的目标是从文本文件构建IndexEntry对象的ArrayList。 IndexEntry具有以下字段:String word ,表示文本文件中的此唯一单词,以及ArrayList numsList ,该列表包含文本文件的行,其中单词发生。

我构建的ArrayList必须对IndexEntries进行排序,以使其 word 字段按字母顺序排列。但是,我想以最快的方式做到这一点。目前,我访问文本文件中显示的每个单词,并使用二进制搜索来确定该单词的IndexEntry是否已存在,以便将当前行号添加到其 numsList 。如果IndexEntry不存在,我会在适当的位置创建一个新的,以保持字母顺序。

实施例

_

一个

两个

_

会产生一个IndexEntries的ArrayList,其输出为String(按 word numsList 的顺序)为:

一个[1,5],三个[7],两个[3]

请记住,我正在使用更大的文本文件,并且会出现多次相同的单词。

问题:

二元搜索是解决此问题的最快方法吗?我仍然是Java编程的新手,我很好奇搜索在这种情况下可能表现更好的算法,或者与我当前的解决方案相比,使用哈希表的相对时间复杂度。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用TreeMap或ConcurrentSkipListMap来保持索引的排序。

但是,如果您只需要索引末尾的排序列表,那么旧的HashMap< String,List>是要走的路(ArrayList作为值也可能是一个安全的赌注) 完成后,获取地图的值并按键对其进行一次排序。

对于几百兆字节的文本文件应该足够好。

如果您使用的是Java 8,请使用简洁的computeIfAbsentcomputeIfPresent方法。