2014-10-18 4 views
-3

Я пишу небольшую программу, которая позволяет пользователю запрашивать базу данных, содержащую сведения об учетной записи. База данных - это простой текстовый файл. Проблема, которая у меня есть, заключается в том, что моя функция, которая предположит, чтобы увидеть, содержит ли строка ключевые слова, иногда приводит к дублированию результатов.Java String.contains() производит повторяющиеся результаты

Вот мой код:

public void actionPerformed(ActionEvent arg0) { 
        // Clear the text area. 
        textAreaRecords.setText(""); 

        String keyword; 
        String[] keywords; 
        String[] parts; 
        String line; 
        String record = ""; 
        boolean recordFound = false; 

        // Get keywords from field. 
        keyword = textFieldKeywords.getText(); 
        keywords = keyword.split(" "); 

        // Open the file and read form it. 
        try { 
         FileReader fReader = new FileReader("Passwords.txt"); 
         BufferedReader reader = new BufferedReader(fReader); 

         while((line = reader.readLine()) != null) { 
          parts = line.split("\t"); 

          for(int i = 0; i < keywords.length; i++) { 
           if(parts[0].contains(keywords[i])) 
            recordFound = true; 
          } 

          if(recordFound) { 
           if(parts.length == 5) 
            record += parts[0] + "\t" + parts[1] + "\t" + parts[2] + "\t" + parts[3] + "\t" + parts[4] + "\n"; 
           else 
            record += parts[0] + "\t" + parts[1] + "\t" + parts[2] + "\t" + parts[3] + "\n"; 

           textAreaRecords.append("Account \t Username \t Password \t Email \t Notes\n\n"); 
           textAreaRecords.append(record); 
          } 
         } 
        }catch(Exception e) { 
         e.printStackTrace(); 
        } 

       } 

Пример дублированных результатов ...

База данных содержит:
BT username password email someOtherNotes Gmail username password email someOtherNotes Gmail OtherGmail password email notes

Ключевые слова при условии: Gmail

Результаты программы:
BT username password email someOtherNotes Gmail username password email someOtherNotes

Что случилось и как его исправить?

ответ

0

Как только вы найдете укол, вы переключаете recordFound на true. Если следующая строка будет прочитана, значение recordFound не будет сброшено до false, то есть с этого момента вы всегда укажете свой последний оператор if.

Просто введите recordFound = false как первый оператор в цикле while, и ваша проблема должна быть исправлена.

Это, как говорится:

  • Вы должны быть в состоянии решить такую ​​проблему самостоятельно. Попробуйте использовать отладчик и попытайтесь понять, почему ваша программа не делает то, что вы ожидаете от нее. Изучение того, как отлаживать, является необходимым навыком, если вы хотите запрограммировать
  • Чтение файлов и разбор всего его содержимого не должны выполняться в методе actionPerformed. Для небольшого файла это будет работать довольно быстро. Но как только ваш файл станет больше, чтение файла займет больше времени. В течение этого времени ваш пользовательский интерфейс не может обновляться, поскольку вы блокируете поток пользовательского интерфейса. Для получения дополнительной информации обратитесь к руководству Concurrency in Swing.
  • При чтении файлов вам нужно закрыть считыватель, как только вы закончите. Это делается либо в блоке finally, либо с использованием попытки с использованием ресурсов, доступной с JDK7 (см. this tutorial для получения дополнительной информации).
+0

Спасибо за ваш совет. Это устранило мою проблему. Я посмотрю и на другие вещи. – user4155352

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