2015-08-23 5 views
0

Два цикла while while меня путают.2 do while loop

Я создал функцию, используемую для сопоставления с числом в 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);  
} 
+1

Что это делается? Что вы сравниваете? –

+0

Я хочу сравнить все значения в массиве с массивом. Пример: array hold [2,3] и array1 содержит [1,2,3,0,0]. Индекс 0 в массиве будет сравнивать весь индекс в массиве1. После завершения сравнения он будет продолжать сравнивать индекс 1 в массиве и снова начинать с индекса 0 в массиве. –

ответ

3

Я вижу, по крайней мере, две проблемы, связанные с этим методом:

  1. Два вложенные do { ... } while() петли могут заканчиваться бесконечным циклом. То есть, если array[a]==array1[b] истинно в любое время, внутренний счетчик b никогда не будет увеличен (то есть b++ никогда не вызывается).
  2. , если один из массивов имеют длину 0, этот метод будет сгенерирован IndexOutOfBoundsException

В своем нынешнем виде, этот метод будет делать только то, что это, как предполагается, если оба массив не является пустым (длиной> 0) и НЕТ Фактическое совпадение может быть найдено.

Явные 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).

+0

Я должен получить два счета в качестве вывода, потому что у меня есть два ряда в моем sql. Но я получаю только счет во вторых строках. –

+0

@Seng Вы вызываете 'CountMatching (Object, Object)' только один раз в 'ComparePre (Object [])'. Следовательно, вы получаете только один выход. – Carsten

+0

ComparePre (Object), содержащий пользовательский ввод, который используется для сравнения значения в sql .. Все значения в sql были сохранены в переменной b в функции ComparePre. –

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); 
     } 
    } 
}