0

ユーザーが観察結果を CSV ファイルに入力して保存できるようにするプログラムがあります。ファイルを読み取って、ユーザーが検索した観測のみを出力できるようにしたいと考えています。(例: ユーザーが「planet」と入力すると、planet を含むすべての行が出力されます。現在のコードでは、指定された行だけでなく、ファイル全体が出力されます。これを行うための論理ステートメントを設定するのに問題があります。

これが私のコードです:

void findbird() throws IOException{


    Scanner input = new Scanner(System.in);
    System.out.println("Please enter the type of bird you wish to search for");
    String bird;
    bird = input.next();
    System.out.println("All observations of " + bird + "s:");

    BufferedReader br = new BufferedReader(new FileReader("birdobservations.txt"));
    String dataRow = br.readLine();
    boolean contains = bird.toLowerCase().contains(dataRow.toLowerCase());

    while (dataRow != null){
        String[] dataArray = dataRow.split(",");
        for (String item:dataArray) { 
            if(contains = true){
                System.out.print(item + "\t"); 
            }else{
                System.out.println("No observations of " + bird + " found!");
            }

        }

        System.out.println(); 
        dataRow = br.readLine(); 
    }

    br.close();
    System.out.println();

    menu();
}

現在、私の出力は次のようになっています。

検索したい鳥の種類を入力してください

カラス

カラスのすべての観測: カラス X ベルゲン 2015 年 5 月

ウッドペッカー M オスロ July2012

ハチドリ M カウパンガー 2015 年 12 月

私は印刷したいだけですが:

クロウ X ベルゲン 2015 年 5 月

4

4 に答える 4

0

ロジックが逆になっています。行う:

 boolean contains = dataRow.toLowerCase().contains(bird.toLowerCase());

また、あなたが持っているという事実:

            if(contains = true){
                System.out.print(item + "\t"); 
            }else{
                System.out.println("No observations of " + bird + " found!");
            }

containsは、containsに割り当てているため、常に true になることを意味しtrueます。あなたがする必要があります:

        if(contains == true){
            System.out.print(item + "\t"); 
        }else{
            System.out.println("No observations of " + bird + " found!");
        }
于 2013-09-18T23:47:30.580 に答える
0

いくつかの問題があります....最も明白な2つは次のとおりです。

  1. boolean contains = bird.toLowerCase().contains(dataRow.toLowerCase());きっと逆のはずです (dataRow...contains(...bird...))
  2. contains最初にtrueに設定された後にすべてを出力するように、ブール変数をリセットすることはありません...contains = falseどこかにある必要があります

一般に、おそらく次のようなループが必要です。

String dataRow = null;
while ( (dataRow = scanner.readLine() ) != null) {
   ....
}

そうすれば、ループの外側でも愚かな readLine を実行する必要がなくなり、コードが煩雑になります。

これらのコードの問題を修正したら、編集した質問でもう一度戻ってきてください。

于 2013-09-18T23:43:43.803 に答える
0

これが問題のコードです

        String dataRow = br.readLine();
        boolean contains = bird.toLowerCase().contains(dataRow.toLowerCase());

    while (dataRow != null){
    String[] dataArray = dataRow.split(",");
        for (String item:dataArray) { 
            if(contains = true){
                System.out.print(item + "\t"); 
            }else{
                System.out.println("No observations of " + bird + " found!");
            }
 }

に変更します

while((dataRow = br.readline())!= null)
{
//And now you get value of contain and then check if contain == true and add other piece of code
}
于 2013-09-18T23:45:26.297 に答える