这两个while while循环让我很困惑..
我创建了一个用于匹配sql中的数字的函数。如果存在用户输入值,则将添加1. (Object[] array)
保留用户输入值并与sql中的值进行比较。 sql中有两行。
该程序应该是这样的:
(Object[] array) // assuming it holds
[2,3]
Object[] array1 // holding
[1,2,3,0,0] and [2,5,6,0,0]
Output : 2 1
但我无法获得任何输出......我的代码出了什么问题?
我很确定错误来自CountMatching(Object []数组,Object [] array1)
public void ComparePre(Object[] array) throws Exception {
String sql="Select Pre1,Pre2,Pre3,Pre4,Pre5 from preferences ";
DatabaseConnection db = new DatabaseConnection();
Connection conn =db.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
Object[] b=new Object[5];
while (rs.next()) {
Vector r = new Vector(); // sql data to vector
r.add(rs.getInt("Pre1"));
r.add(rs.getInt("Pre2"));
r.add(rs.getInt("Pre3"));
r.add(rs.getInt("Pre4"));
r.add(rs.getInt("Pre5"));
System.out.println(r);
Object[] array1 = new Object[5];
r.copyInto(b);
}
CountMatching(array,b);
ps.close();
rs.close();
conn.close();
}
private void CountMatching(Object[] array, Object[] array1) {
int count=0;
int a=0;
do {
int b=0;
do {
if(array[a]==array1[b]) {
count++;
} else if(array[a]!=array1[b]) {
b++;
}
} while(b<array1.length);
a++;
} while (a<array.length);
System.out.println(count);
}
答案 0 :(得分:3)
我发现此方法至少存在两个问题:
do { ... } while ()
循环可能会以无限循环结束。也就是说,如果array[a]==array1[b]
在任何时候都为真,则内部计数器b
将永远不会增加(即永远不会调用b++
)。0
,则此方法将抛出IndexOutOfBoundsException
在目前的形式中,如果两个数组都不为空(长度> 0)并且 NO 可以找到实际匹配,则该方法将仅执行预期的操作。
显式for
循环可能会阻止这种情况,如果这是你需要的:
private void CountMatching(Object[] array, Object[] array1) {
int count = 0;
for (int a = 0; a < array.length; a++) {
for (int b = 0; b < array1.length; b++) {
if (array[a] == array1[b]) {
count++;
}
}
}
System.out.println(count);
}
或者,如果您不需要其他任何特定指数:
private void CountMatching(Object[] array, Object[] array1) {
int count = 0;
for (Object arrayEntry : array) {
for (Object array1Entry : array1) {
if (arrayEntry == array1Entry) {
count++;
}
}
}
System.out.println(count);
}
在您当前的代码r.copyInto(b)
中始终覆盖之前数组中的任何内容,因此您只获得最后一个结果行:
Object[] b=new Object[5];
while (rs.next()) {
Vector r = new Vector(); // sql data to vector
r.add(rs.getInt("Pre1"));
r.add(rs.getInt("Pre2"));
r.add(rs.getInt("Pre3"));
r.add(rs.getInt("Pre4"));
r.add(rs.getInt("Pre5"));
System.out.println(r);
Object[] array1 = new Object[5];
r.copyInto(b);
}
CountMatching(array,b);
最简单的方法是将CountMatching(array,b)
向上移动一行(即进入while循环)。
答案 1 :(得分:1)
如果我理解了您的问题,您可以使用int[]
(并避免使用Vector
)。另外,我建议for-each
loops和try-with-resources
。像,
static void countMatching(int[] a, int[] b) {
int count = 0;
for (int i : a) {
for (int j : b) {
if (i == j) {
count++;
}
}
}
System.out.printf("The matching count is %d%n", count);
}
public void comparePre(int[] array) throws Exception {
String sql = "Select Pre1,Pre2,Pre3,Pre4,Pre5 from preferences";
DatabaseConnection db = new DatabaseConnection();
try (Connection conn = db.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int[] array1 = new int[] { rs.getInt("Pre1"),
rs.getInt("Pre2"), rs.getInt("Pre3"),
rs.getInt("Pre4"), rs.getInt("Pre5") };
countMatching(array, array1);
}
}
}