0

次のスニペットでは、クエリを実行し、結果セットをに渡しますset。次に、setがに割り当てられset1ます。その後、がset.next戻るまで続くwhileループがありますfalseset.nextループの後にfalseを返す場合、 falseset1も返すということですか?

ResultSet set = statement.executeQuery();
ResultSet set1 = set;
while (set.next()) {
    if (set.getString(1).equalsIgnoreCase(keyword)) { 
        // If the search matches the exact keyword
        list.put(set.getString(2), set.getString(1));
        // Where key is the name of the node and value is, name of the file
    }
}

私はこれを尋ねました:

while (set1.next()) {
    System.out.println("@@@Inside the while statement@@@");
    if (set1.getString(1).contains(keyword) 
    && set1.getString(1).compareToIgnoreCase(keyword) !=0) { 
        // If the search contains the keyword but does not exactly match
        list.put(set.getString(2), set.getString(1));
        // Where key is the name of the node and value is, name of the file
        System.out.println("@@@Inside the if statement of second while loop !@@@");
    }
}

このwhile構成は機能しません。それが理由ですか?もしそうなら、私は何をしますか?

4

4 に答える 4

1

2つの大きなバグがあります。

  1. に割り当てsetてもコピーは作成されset1ません-同じセットです
  2. String.contains()大文字と小文字が区別されます(コードがコメントと一致しません)

修正は次のとおりです。

  1. 2つのループを使用しないでください-1つのループのみを使用してください
  2. `toLowerCase()withを使用しcontains()て、「大文字と小文字を区別しない包含」テストを実行します
  3. また、最初のテストが真である場合、2番目のテストも真であるため、とにかく2つのテスト/ループは必要ありません。

このコードを試してください:

   ResultSet set = statement.executeQuery();
   while(set.next()) {
       if(set.getString(1).toLowerCase()
              .contains(keyword.toLowerCase)) {
           list.put(set.getString(2), set.getString(1));
       }
   }

また、マップを「リスト」と呼ばないでください。「マップ」と呼んでください。そうしないと、コードの読者を混乱させるだけです。

于 2013-02-08T18:55:50.720 に答える
0

あなたはこれをやってみることができます。

   ResultSet set1 = statement.executeQuery();
于 2013-02-08T18:23:32.030 に答える
0

set1setを指す同じオブジェクトへの参照です。もう一度繰り返したい場合はResultSet、次のようなものを使用して、イテレータカーソルを最初にもう一度移動する必要があります。

set.beforeFirst();

Javaでは、変数をオブジェクトに割り当てると、オブジェクトのコピーは作成されず、メモリ内のオブジェクトを参照するだけです。必要に応じてオブジェクトのコピーを明示的に作成し、独立して作業する必要がsetあります。set1

あなたの特定のユースケースでは、それがあなたが望むものではないと思います。反復カーソルを動かすだけの方が良いようです。

于 2013-02-08T18:25:38.780 に答える
0

set.nextループの後にfalseを返す場合、 falseset1も返すということですか?

はいset1参照しているのと同じオブジェクトを参照しているResultsetためですset。したがって、によってResultSet参照されるオブジェクトによって示される動作はすべて、によってsetも反映されset1ます。最初のwhileループでは、(set.next()を使用して)すべてのレコードを反復処理した後ResultSet、によって参照されるオブジェクトが完全に使い果たされます。setその後、どちらの変数(setまたはset1)がさらに読み込もうとしても、両方がとして取得.next()されfalseます。

最初のwhileループ構造で、変数を.next()使用してチェックし、set変数を使用して結果を取得したset1場合でも、機能します。最初の構成の代わりにこのコードを試してみてください。出力は、最初のwhile構成で記述したものと同じであることがわかります。

ResultSet set = statement.executeQuery();
       ResultSet set1 = set;
       while(set.next()) {
           if(set1.getString(1).equalsIgnoreCase(keyword)) { // If the search matches the exact keyword
               list.put(set1.getString(2), set1.getString(1));
               // Where key is the name of the node and value is, name of the file
           }
       }

set1それでも結果を返したい場合は、次ResultSetを使用して新しいオブジェクトを再構築する必要があります。

set1 = stat.executeQuery()

ここで、statStatement/PreparedStatementコードで使用しているものです。

于 2013-02-08T18:28:20.530 に答える