我把我详细的算法程序的前半段贴出来。该算法里头,rs 可以搜索到与参数 Keyword 相关的问题分类,rsc 可以搜索到所有分类,算法的前半部分就是要把两者进行匹配然后统计:int Max=0,Counter=0;

public String[] BestChoice(String Keyword){
Search SS=new Search();
dbConnect DB=new dbConnect();
dbConnect DBC=new dbConnect();
try{
String SqlStr="Select Subclass from [Question] where ";
SqlStr=SqlStr+SS.Similar(Keyword, false);
ResultSet rs=DB.ExecuteQuery(SqlStr);     //搜索相关问题的分类

int SimCount=0;
while(rs.next()){
SimCount++; //统计总数
}
rs.beforeFirst();
System.out.println("相关问题分类共 "+SimCount+" 个");

String[] Class=new String[SimCount];
ResultSet rsc=DBC.ExecuteQuery("Select Subclass from [Class]"); //搜索所有分类

int Count=0;
while(rsc.next()){
Count++; //统计总数

System.out.println("所有分类 "+Count+":"+rsc.getString("Subclass"));
}
rsc.beforeFirst();
System.out.println("所有分类共 "+Count+" 个");

int[] Num=new int[Count];
for(int i=0;i<Count;i++){
Num[i]=0; //初始化计数数组
}

int i=0;
while(rsc.next()){
Class[i]=rsc.getString("Subclass"); //先对所有分类进行逐行扫描
while(rs.next()){
if(Class[i].equals(rs.getString("Subclass"))){ //如果该分类与某相关问题分类匹配
Num[i]++; //则该分类的统计值加 1

System.out.println("分类 "+Class[i]+" 与 "+rs.getString("Subclass")+" 匹配");
}
else System.out.println("分类 "+Class[i]+" 与 "+rs.getString("Subclass")+" 不匹配");
}
rs.beforeFirst();
i++;
}
……而执行结果是:相关问题分类共 3 个
所有分类 1:奥运
所有分类 2:篮球
所有分类 3:实况足球
所有分类 4:足球

所有分类共 4 个
分类 奥运 与 足球 不匹配
分类 奥运 与 足球 不匹配
分类 奥运 与 足球 不匹配
分类 篮球 与 足球 不匹配
分类 篮球 与 足球 不匹配
分类 篮球 与 足球 不匹配
分类 实况足球 与 足球 不匹配
分类 实况足球 与 足球 不匹配
分类 实况足球 与 足球 不匹配大家看看,明明 rsc 指针可以找到 4 个分类,但是再循环进行分类匹配计算的时候却只出现了前面的三个!!!最后一个没了!!!到底是怎么回事?我明明循环语句写的是 while(rsc.next()){……} 啊,在我其它所有的程序里,这种语句向来都是数据库每行全走的,为什么一到这里就在倒数第二行停住了???

解决方案 »

  1.   

    while(rsc.next()){
      while(rs.next()){
    很明显,那个rs只有3个,你这里当然也只能有三个啦
      

  2.   


    没明白。内循环跟外循环的次数又不一定得一样。rs 有三行,它在内循环里走了一遍,然后离开循环,指针归位,然后下一个外循环又执行了刚才的内容,并且外循环 rsc 理应走四遍,为什么第四遍它就不走了?
      

  3.   

    我用注释的方法把代码精简了一遍,但是精简到下面这个份儿上,依然没有找出问题!!!
    ……
    String[] Class=new String[SimCount];
    ResultSet rsc=DBC.ExecuteQuery("Select Subclass from [Class]"); //搜索所有分类

    int Count=0;
    while(rsc.next()){
    Count++; //统计总数

    System.out.println("所有分类 "+Count+":"+rsc.getString("Subclass"));
    }
    rsc.beforeFirst();
    System.out.println("所有分类共 "+Count+" 个");
    ……
    int i=0;
    while(rsc.next()){
    Class[i]=rsc.getString("Subclass"); //先对所有分类进行逐行扫描

    i++;
    }
    结果为什么运行出来还是:所有分类 1:奥运
    所有分类 2:篮球
    所有分类 3:实况足球
    所有分类 4:足球
    所有分类共 4 个
    分类 奥运
    分类 篮球
    分类 实况足球前面有四个,后面只有仨??????
      

  4.   

    我建意你在第一次得到结果集时,把结果放到集合中,如List,这样一是尽早释放数据库资源,二是尽可能的避免了脏读(取决于事务),三就是数据放到集合中与数据库无关了,这可你可以遍例这个集合去比对结果。应该不会出现你说的问题了
      

  5.   

    比如:
    List list1=new ArrayList();
    List list2=new ArrayList();
    while(rs.next()){
    list1.add(rs.getString("Subclass"));
    }
    rs.close();
    while(rsc.next()){
    list1.add(rsc.getString("Subclass"));
    }
    rsc.close();
    //关闭联接等资源
    //比较两个list中数据
      

  6.   

    不要用while循环,用别的,另外用调试工具看下rsc就可以了。