两个做while循环

时间:2015-08-23 06:47:08

标签: java sql arrays vector

这两个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);     
}

2 个答案:

答案 0 :(得分:3)

我发现此方法至少存在两个问题:

  1. 两个嵌套的do { ... } while ()循环可能会以无限循环结束。也就是说,如果array[a]==array1[b]在任何时候都为真,则内部计数器b将永远不会增加(即永远不会调用b++)。
  2. 如果其中一个数组的长度为0,则此方法将抛出IndexOutOfBoundsException
  3. 在目前的形式中,如果两个数组都不为空(长度> 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 loopstry-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);
        }
    }
}