Java String.contains()产生重复的结果

时间:2014-10-18 18:24:26

标签: java

我正在编写一个小程序,允许用户查询包含帐户信息的数据库。数据库只是一个简单的文本文件。我遇到的问题是我的函数假设查看字符串是否包含关键字,有时会产生重复的结果。

这是我的代码:

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

出了什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:0)

一旦找到匹配,您就会将recordFound切换为true。如果读取下一行,则recordFound的值不会重置为false,这意味着从那一刻开始,您将始终输入上一个if语句。

只需在recordFound = false循环中添加while作为第一个语句,您的问题就应该得到解决。

话虽如此:

  • 你应该能够自己解决这个问题。尝试使用调试器并尝试找出为什么您的程序没有按照您的预期进行操作。如果您想编程
  • ,学习如何调试是必要的技能
  • 不应在actionPerformed方法中读取文件并解析其全部内容。对于一个小文件,这将运行得非常快。但是一旦文件变大,读取文件将花费更多时间。在此期间,当您阻止UI线程时,您的UI无法更新。有关详细信息,请参阅Concurrency in Swing教程。
  • 阅读文件时,您需要在完成后关闭阅读器。这可以在finally块中完成,也可以使用从JDK7开始提供的try with resources构造(有关详细信息,请参阅this tutorial)。