Идея 1
Начните с рассмотрения этого:
while ((line = stdin.readLine()) != null) {
По крайней мере, использовал в том случае, если readLine
вернет String
с поддержкой char[]
не менее 80 символов. Будет ли это проблемой, зависит от того, что делает следующая строка:
String[] sentence = line.split("\\s+");
Вы должны определить, имеют ли строки, возвращаемые split
, одинаковые значения char[]
.
Если они есть (и если ваши строки часто короче 80 символов), вы должны использовать:
line = new String(line);
Это создаст клон копии строки с массивом строк «правильного размера»
Если они не , то вам, возможно, следует выработать какой-то способ создания того же поведения, но изменить его, чтобы они do использовали одну и ту же основу char[]
(т.е. они подстроки исходной строки) - и, конечно же, выполните ту же операцию клонирования. Вам не нужно выделять char[]
на слово, так как это будет тратить гораздо больше памяти, чем пробелы.
Идея 2
Ваш заголовок говорит о плохой производительности списков - но, конечно, вы можете легко вычеркнуть список из этого уравнения, просто создав String[][]
, по крайней мере, для целей тестирования. Похоже, вы уже знаете размер файла - и если вы этого не сделаете, вы можете запустить его через wc
, чтобы проверить заранее. Просто чтобы посмотреть, сможете ли вы избежать этой проблемы , чтобы начать с .
Идея 3
Сколько различных слов в вашем корпусе? Рассматривали ли вы сохранить HashSet<String>
и добавлять каждое слово к нему, когда вы сталкиваетесь с ним? Таким образом, вы, вероятно, в конечном итоге получите на гораздо меньше строк. На этом этапе вы, вероятно, захотите отказаться от «единственной поддержки char[]
на строку» из первой идеи - вы бы хотели , чтобы каждая строка поддерживалась собственным массивом символов, иначе строка с одно новое слово все еще будет требовать много символов. (В качестве альтернативы для реальной тонкой настройки вы можете увидеть, сколько «новых слов» имеется в строке, и клонировать каждую строку или нет.)