2013-08-07 4 views
0

Я кодирую codingbat.com/java и сталкивался с ошибкой, которую я не понимаю. Я получил два массива String и хочу их сравнить. Если я просто использую массивы, все работает нормально (но результат неверен). Чтобы получить правильный результат, я запрограммировал вспомогательную функцию, которая устраняет все дубликаты массива. Я проверил вспомогательную функцию, она возвращает массив, сокращенный дубликатов.Исключение: java.lang.NullPointerException при сравнении двух строк двух разных строковых массивов

Я могу получить значения в новых массивах с помощью _a[i] и т. Д., И не получаю ошибок, но если я использую _a[0].equals(_b[0]) or _a[0].compareTo(_b[0]), я получаю NullPointerException (_a[0] == _b[0] works fine...).

Если я просто использую оригинальные массивы a, b, код работает без проблем. Я не понимаю, почему я получаю исключение NullpointerException.

Спасибо за помощь!

Код:

public int commonTwo(String[] a, String[] b) { 

     String[] _a = killDuplicate(a); 
     String[] _b = killDuplicate(b); 

     int ai=0, bi=0,count=0; 

     for (int i = 0; ai < _a.length & bi < _b.length; i++){ 
     if (_a[ai].compareTo(_b[bi]) > 0) { //NullPointerException here, but not if I use a,b 
      bi++; 
     } else if (_a[ai].compareTo(_b[bi]) < 0){ //NullPointerException here, but not if I use a,b 
      ai++; 
     } else { 
      count++; 
      ai++; 
      bi++; 
     } 
     } 
     return count; 
} 

Helper Функция:

public String[] killDuplicate(String[] a){ 

    String temp = ""; 
    int counter = 0, counter2 = 0; 

    for (int i = 0; i < a.length; i++){ 
     if (! a[i].equals(temp)){ 
      temp = a[i]; 
     } else { 
      a[i] = ""; 
      counter++; 
     } 
    } 

    String[] result = new String[a.length - counter]; 

    for (int i = 0; counter2 < counter; i++){ 
     if (a[i].equals("")) { 
      counter2++; 
     } 
    } else { 
     result[i-counter2] = a[i]; 
    } 
    return result; 
} 
+0

Товар, возвращаемый '_a [аи]' или '_b [би]' имеет нулевое значение, следовательно, ваша ошибка. – Robadob

+0

k, моя вспомогательная функция кажется неправильной, у меня просто был плохой тестовый файл, который вернул правильное значение, но не для других значений. Я пытаюсь это исправить. Изменить: Да, ошибка в вспомогательной функции, см. Ответ ниже, спасибо в любом случае –

ответ

0

Я думаю, вы предполагаете, что ваш массив строк сортируются, в противном случае вашего метод killDuplicate не имеет смысл вообще.

Проблема с кодом является то, что во втором for цикле в killDuplicate методе итерации с условием counter2 < counter, который говорит итерацию, пока не будут пройдены все найденные дубликаты. Поэтому, когда вы находите свой последний дубликат, вы выходите без заполнения остальной части массива. Попробуйте пример: new String[]{"A", "A", "B", "C"} вы получите [A, null, null].

Существует множество вещей, которые можно улучшить, но простейшая модификация вашего кода ниже. (Я изменил только второй for цикл) общественного String [] killDuplicate (String [] а) {

String temp = ""; 
    int counter = 0, counter2 = 0; 

    for (int i = 0; i < a.length; i++) { 
     if (!a[i].equals(temp)) 
      temp = a[i]; 
     else { 
      a[i] = ""; 
      counter++; 
     } 
    } 

    String[] result = new String[a.length - counter]; 

    for (int i = 0; i < a.length; i++) { 
     if (a[i].equals("")) continue; 
     result[counter2] = a[i]; 
     counter2++; 
    } 

    return result; 
} 
+0

Да, вы правы, я забыл упомянуть, что массивы отсортированы в этом упражнении. А остальное тоже правильно, спасибо :) –

Смежные вопросы