2013-08-07 113 views
0

我正在編碼槽編碼bat.com/atava並遇到一個我不明白的錯誤。我有兩個字符串數組,並想比較它們。如果我只是使用數組,所有工作正常(但結果是不正確的)。爲了獲得正確的結果,我編寫了一個輔助函數,它可以消除數組中的所有重複項。我測試了輔助函數,它返回了重複數組縮短的數組。例外:比較兩個不同字符串數組的兩個字符串時的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; 
} 

輔助功能:

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 [AI]返回'或'_b [雙]'爲空,因此你的錯誤。 – Robadob

+0

k,我的幫助函數似乎是錯誤的,我只是有一個糟糕的測試用例,它返回了一個正確的值,但它不適用於其他值。我嘗試修復它。編輯:是的幫助函數中的錯誤,請參閱下面的答案,謝謝 –

回答

0

我猜你認爲你的字符串數組排序,否則你killDuplicate方法是沒有意義的。

與您的代碼的問題是,在killDuplicate方法第二for循環您的條件counter2 < counter直到找到的所有副本都通過它說迭代循環。所以當你發現你的最後一個副本時,你不需要填充數組的其餘部分即可退出。嘗試使用示例:new String[]{"A", "A", "B", "C"}您將獲得[A, null, null]

有很多事情可以改進,但下面的代碼是最簡單的修改。 (我已經改變僅第二for迴路) 公共字符串[] killDuplicate(字符串[]一個){

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

是的,我忘了提及數組在本練習中排序。其餘的也是對的,謝謝:) –