在以下代码段中,我执行查询并将结果集传递给set
。然后set
被分配到set1
。之后会有一个while循环,直到set.next
返回false
。如果set.next
在循环后返回false,set1
也会返回false吗?
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
结构永远不会起作用。这是什么原因?如果是这样,我该怎么办?
答案 0 :(得分:1)
你有两个主要的错误:
set
分配给set1
不会复制 - 这是同一套String.contains()
区分大小写(您的代码与您的评论不符)修复方法是:
`toLowerCase()
与contains()
一起使用以实现“不区分大小写的包含”测试试试这段代码:
ResultSet set = statement.executeQuery();
while(set.next()) {
if(set.getString(1).toLowerCase()
.contains(keyword.toLowerCase)) {
list.put(set.getString(2), set.getString(1));
}
}
此外,不要将地图称为“列表” - 将其称为“地图”,否则只会让读者感到困惑。
答案 1 :(得分:0)
你可以尝试这样做。
ResultSet set1 = statement.executeQuery();
答案 2 :(得分:0)
set1
是对set
指向的同一对象的引用。如果你想再次遍历ResultSet
,你需要使用类似的东西再次将迭代器光标移动到开头:
set.beforeFirst();
在Java中,为对象分配变量不会创建对象的副本,它只引用内存中的对象。如果您希望set
和set1
独立工作,则必须明确制作该对象的副本。
在你的特定用例中,我认为这不是你想要的,只是移动迭代光标似乎更好。
答案 3 :(得分:0)
如果
set.next
在循环后返回false,那么set1
也是如此 返回false?
是即可。因为set1
指的是Resultset
所指的set
的同一个对象。因此ResultSet
引用的set
对象所展示的任何行为也会由set1
反映。在您的第一个while循环中,ResultSet
引用的set
对象迭代到所有记录后(使用set.next())完全耗尽。此后,无论哪个变量(set或set1)尝试阅读更多变量,都会.next()
为false
。
如果在你的第一个while循环结构中,我使用.next()
变量检查set
并使用set1
变量获得结果它仍然有效。
尝试使用此代码而不是第一个构造,您将看到输出与第一个构造中的内容相同:
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()
其中,stat
是您在代码中使用的Statement/PreparedStatement
。