2011-03-22 27 views
-1

我要使搜索方法更有效,我決定使用二分搜索。我想使用此搜索將每個項目行號添加到找到的單詞列表中,並顯示每個項目被找到的次數。但我的代碼似乎沒有工作...二進制搜索和在Java中添加

private static void searchAndAdd(List<Word> wl, String w, int ln) { 
    boolean found = false; 
    Iterator<Word> wit = wl.listIterator(); 
    int min = 0; 
    int max = wl.size()-1; 

    int bsearch = binarySearch(wl, w, min, max); 
    while (found && wit.hasNext()) { 
     Word wd = wit.next(); 
     if (bsearch == -1) 
     { 
      wd.addLineNumber(ln); 
     } 
    } 
    if (!found) 
     wl.add(0, new Word(w, ln)); 
} 
private static int binarySearch(List<Word> arr, String w, int min, int max) { 
    if (min < max) { 
      return NOT_FOUND; 
    } 
    int mid = (min + max) /2; 
    Word w2 = arr.get(mid); 
    if (w.compareTo(w2.toString()) > 0) { 
      return binarySearch(arr, w, mid + 1, min); 
    } else if (w.compareTo(w2.toString()) < 0) { 
      return binarySearch(arr, w, min, mid - 1); 
    } else { 
      return mid; 
    } 

我總是得到這樣的錯誤:

in thread "main" java.lang.NullPointerException 
at Concordance.binarySearch(Concordance.java:131) 
at Concordance.searchAndAdd(Concordance.java:114) 
at Concordance.main(Concordance.java:51) 
+2

對此不起作用? – nojo 2011-03-22 21:06:45

+0

它不斷給我這個errorException線程 「main」 顯示java.lang.NullPointerException \t在Concordance.binarySearch(Concordance.java:131) \t在Concordance.searchAndAdd(Concordance.java:114) \t在Concordance.main( Concordance.java:51) – namdizy 2011-03-22 21:09:14

+0

似乎沒有添加該行。 – namdizy 2011-03-22 21:09:50

回答

1

不知道這是你唯一的問題,但我懷疑你的二進制搜索沒有過搜索任何東西,因爲該行:

if (min < max) { 
     return NOT_FOUND; 
} 

非空列表總是如此。

+0

您可能想考慮在二分查找中編寫一些單元測試。你也在這一行有一個錯誤:return binarySearch(arr,w,mid + 1,min); – nojo 2011-03-22 21:10:58

+0

我補充說,行只是作爲一個支票,但我總是調用的列表不是空的。 – namdizy 2011-03-22 21:13:26

+0

使用一個調試器,在該行(比較最小和最大的那個)放置一個斷點,並查看這些值。 – nojo 2011-03-22 21:40:03