2015-06-11 3 views
-2

Я мог бы просто сделать что-то глупо здесь, но я пытаюсь написать программу, которая возьмет весь текст из XML-файла, положите его в arraylist как строки, затем найдите определенные повторяющиеся строки и посчитайте их. Он в основном работает, но по какой-то причине он не пройдет весь XML-файл. Это довольно большой файл с более чем 15000 строк (в идеале я бы хотел, чтобы он мог передать любое количество строк). Я сделал тест, чтобы вывести все, что он помещал в arraylist в .txt-файл, и, в конце концов, последняя строка просто говорит «нет», и есть еще много текста/строк для прохождения.Java - Попытка создать arraylist строк, но arraylist получает полный (?)

Это код, я использую, чтобы сделать ArrayList (линии этого количества строк в файле):

// make array of strings 
for (int i=0; i<lines; i++) { 
    strList.add(fin2.next()); 
} 
fin2.close(); 

Тогда я искал нужные строки с:

// find strings 
for (String string : strList) { 
    if(string.matches(identifier)){ 
     count++; 
    } 
} 
System.out.println(count); 
fout.println(count); 

В основном он работает (работают сценаристы и сканеры, работает счетчик строк и т. Д.), За исключением того, что arraylist не принимает весь текст из XML-файла, поэтому, конечно, счетчик в конце неточен. Является ли arraylist не лучшим решением для этой проблемы?

+1

Что такое 'fin2'? –

+0

Я думаю, что fin2 - это сканер («работа над принтером и сканерами»), но в этом случае я понятия не имею, почему он закрыт. –

+1

Было бы лучше, если бы вы опубликовали минимальную, но полную программу, которую мы также можем воспроизвести. В противном случае мы просто догадываемся, что случилось. – sstan

ответ

0

Вы пытались использовать карту, такую ​​как HashMap. Поскольку ваша цель - найти появление слова из xml, hashmap сделает вашу работу проще.

0

Проблема не в вашем ArrayList, а в вашей петле. То, что происходит, заключается в том, что вы используете количество строк в вашем файле в качестве значения вашего наблюдателя, но вместо того, чтобы увеличивать i на 1 каждую строку, вы делаете это каждое слово. Поэтому не все слова добавляются в ваш ArrayList, потому что ваш цикл завершается раньше, чем ожидалось. Надеюсь это поможет!

EDIT: Я не знаю, какой объект вы используете прямо сейчас, чтобы собрать содержимое этого XML-файла, но я бы предложил вместо этого использовать Scanner (передав файл в качестве параметра в конструкторе) и заменив текущий для петля с замкнутым контуром, который использует while (nameOfScanner.hasNextLine())

1

Это BAD Практика. Каждый раз, когда вы помещаете строку в ArrayList и сохраняете ее там, у вас будет увеличение использования памяти. Чем больше файл, тем больше памяти используется до такой степени, что вам интересно, почему ваше приложение использует 75% вашей памяти.

Вам не нужно хранить строки в ArrayList, чтобы убедиться, что они совпадают. Вы можете просто просто прочитать строку и сравнить ее с любым текстом, с которым вы сравниваете это.

Здесь будет ваш код изменен:

String nextString = ""; 
while (fin2.hasNext()) { 
    nextString = fin2.next(); 
    if (nextString.matches(identifier) || nextString.matches(identifier2)) { 
     count++; 
    } 
} 
fin2.close(); 
System.out.pritnln(count); 

Исключает перекручивание через все два раза, экономит вам кучу памяти, и дает точные результаты. Также я не уверен, что вы хотите прочитать всю строку, или у вас есть какой-то токен. Если вы хотите, чтобы прочитать всю строку, изменить hasNext к hasNextLine и next к nextLine

Edit: Модифицированный код, чтобы показать, что это будет выглядеть как искать несколько строк.

+0

Кажется, что это исправит проблему, но это делает так, что я не могу запустить один и тот же код несколько раз, чтобы искать другие строки без необходимости создавать кучу сканеров. Я хочу, чтобы иметь возможность искать несколько разных строк в файле, поэтому я сначала помещал строки в arraylist. – Kellhus

+0

Отредактирован фрагмент, позволяющий использовать несколько поисковых запросов. Если у вас есть большое количество поисковых запросов, вы можете просто иметь массив поисковых терминов и прокручивать их, сравнивая их с nextString внутри цикла while. –

+0

Мне нужно, чтобы каждый найденный поисковый запрос имел свой собственный счет, хотя я, вероятно, должен был сказать это раньше. – Kellhus

Смежные вопросы