Javaおよび再帰でResultSet
オブジェクトに関する質問があります。再帰を使用するとResultSetがリセットされる
私は大学のコードに取り組んでいました。子孫が見つかったときには、その新しいノードで再帰しましたが、再帰から出てrs.next()を試してみると、ポインタは1行目行0に戻り、行0に達したときにrs.next()が失敗し、それが返されました。そこにまだ読んでいなかったものが1つあることは分かっていました。これを引き起こす原因は何ですか?
この問題を解決する唯一の方法は、結果セットを調べてすべての要素を取得して配列リストに追加し、配列内の各要素の再帰を行うarraylistをループすることでした。確かに、これはこれの周りのより良い方法でなければならない?
これはでしょうしかし、この前に、私はwhile
ループ内getDescendents
電話を持っていたので、どちらかのループなしのArrayListには、それは実際にそれを再帰たび、私は
private Vector<String> getDescendents(String dogname, Vector<String> anc) {
if (anc == null) anc = new Vector<String>();
ArrayList<String> tempList = new ArrayList<String>(2);
try {
System.out.println("Inside ");
childStmt.setString(1,dogname);
childStmt.setString(2,dogname);
ResultSet rs = childStmt.executeQuery();
System.out.println("Before while "+rs.getRow());
while (rs.next()){
String col1 = rs.getString(1);
tempList.add(col1);
anc.add(col1);
}
for (String s:tempList){
getDescendents(s,anc);
}
}
catch(Exception e) {
doError(e, "Failed to execute ancestor query in getBreeding");
}
return anc;
}
を使用している新しいコードであります再帰から戻ったときの結果セットの緩やかなトラック。
詳細: 私はデバッガを使用していましたが(gdbとほとんど同じですが、Cではあまりにも多すぎます)、結果セットのIDは同じでしたが、行ポインタは0に戻り、rs.next呼び出しは失敗しました!
ここでも説明はありがたいです! ;それは以前にあなたがchildStmt
を再利用しているように見えます
private Vector<String> getDescendents(String dogname, Vector<String> anc) {
if (anc == null) anc = new Vector<String>();
ArrayList<String> tempList = new ArrayList<String>(2);
try {
System.out.println("Inside ");
childStmt.setString(1,dogname);
childStmt.setString(2,dogname);
ResultSet rs = childStmt.executeQuery();
System.out.println("Before while "+rs.getRow());
while (rs.next()){
String col1 = rs.getString(1);
anc.add(col1);
getDescendendts(col1,anc);
}
}
catch(Exception e) {
doError(e, "Failed to execute ancestor query in getBreeding");
}
return anc;
}
前のコードはどのように見えましたか? –
Javaでの再帰は、通常、テールコールの最適化がないために悪い考えです。結果セットを開く途中の再帰はひどい考えです。 –
ええ、私は再帰が嫌いだが、タスクはそれを必要とすることに同意する:P子孫を転覆させるツリートラバーサルなどのものは、@ nicholas.hauschildと非常によく似ている。 – andrewktmeikle