2014-10-18 2 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

히트를 발견하면 recordFoundtrue으로 전환합니다. 다음 줄을 읽으면 recordFound의 값이 false으로 재설정되지 않습니다. 그 순간부터 항상 마지막으로 if 문을 입력하게됩니다.

while 루프의 첫 번째 문구에 recordFound = false을 추가하기 만하면 문제가 해결됩니다.

는 말했다되는 :

  • 당신은 이러한 문제를 직접 해결할 수 있어야한다. 디버거를 사용해보고 프로그램이 예상 한대로 작동하지 않는 이유를 찾으십시오. 프로그래밍하려는 경우 디버그하는 방법을 익히는 것은 필수 기술입니다.
  • actionPerformed 방법으로 파일을 읽고 파일의 전체 내용을 파싱해서는 안됩니다. 작은 파일의 경우 이것은 매우 빠르게 실행됩니다. 그러나 파일이 커지면 파일을 읽는 데 더 많은 시간이 걸릴 것입니다. 이 시간 동안 UI 스레드를 차단할 때 UI를 업데이트 할 수 없습니다. 자세한 내용은 Concurrency in Swing 자습서를 참조하십시오.
  • 파일을 읽을 때 작업이 끝나면 리더를 닫아야합니다. 이 작업은 finally 블록에서 수행하거나 JDK7에서 사용할 수있는 try with resources 구문을 사용합니다 (자세한 내용은 this tutorial 참조).
+0

감사합니다. 그게 내 문제를 해결해 줬어. 나는 다른 것들도 살펴볼 것이다. – user4155352

관련 문제