-2

私の「AllBookRecords.txt」ファイルはこれです:

Name        Date        Number
second   2002   22
thired   2003   33
fourth   2004   44
fifth   2005   55

私の検索ボタンのコードは次のとおりです。

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String bookid=jTextField2.getText();
    File f=new File("D:\\AllBookRecords.txt");
    try{
        FileReader Bfr=new FileReader(f);
        BufferedReader Bbr=new BufferedReader(Bfr);
        String bs;
        while( (bs=Bbr.readLine()) != null ){
            if( bs.contains(bookid ) ){
                String[] Ust=bs.split("   ");
                String Bname=Ust[0];
                String Bdate=Ust[1];
                jLabel1.setText("Book Found,    "+ Bname + "    " + Bdate);
            }
        }
    }
    catch (IOException ex) {
        ex.printStackTrace();
    } 
}             

たとえば 33 と入力してボタンをクリックすると、結果は次のような最後のレコードのみを表示します: 5 番目の 2005

なぜ?ご協力ありがとう御座います!

4

1 に答える 1

2

問題の本当の解決策ではないかもしれませんが、本の ID で本を検索する方法では、簡単にエラーが発生する可能性があります。

String.contains(bookid)完全な行に本のIDが含まれているかどうかを確認するために使用しています。

例: 書籍 ID が20最初の行の場合、文字列2002には書籍 ID が含まれているため、次のように一致し20ます。

"second   2002   22".contains("20"); // returns true because 2002 'contains' 20

この問題を解決するには、最初に文字列を分割してから書籍 ID のみを比較する必要があります。

更新:これに対する可能な修正は次のようになります:

while( (bs=Bbr.readLine()) != null ){
    String[] Ust=bs.split("   ");
    String Bname=Ust[0];
    String Bdate=Ust[1];
    String id = Ust[2];
    if (id.equals(bookid.trim()) // only compare Id's + you should always trim user input
        jLabel1.setText("Book Found,    "+ Bname + "    " + Bdate);
        break;
    }
}
于 2012-12-26T16:43:57.510 に答える