2016-09-08 77 views
0

我不知道我的代碼的功能是否是正確的二進制搜索,但這不是我的問題,我想自己解決它。通用二進制搜索 - JAVA -

我的問題是在測試其功能,而我得到以下錯誤:

enter image description here enter image description here

我真的不知道如何解決這個問題。請幫幫我!

我的代碼:

public class BinarySearchGeneric<T extends Comparable<T>>{ 

public int search(T[] array, T element){ 
    int start = 0; 
    int end = array.length - 1; 
    int mid = (start + end)/2; 

    while(!element.equals(array[mid]) && end != 0) { 
     if (element.equals(array[mid])) { 
      return mid; 
     } else if (array[mid].compareTo(element) < 0) { 
      end = mid - 1; 
      mid = (start + end)/2; 
     } else if(array[mid].compareTo(element) > 0){ 
      start = mid + 1; 
      mid = (start + end)/2; 
     } 
    } 
    return -1; 
} 
} 

主要方法:

public class Main { 
public static void main(String[] args) { 

    int[] a = {1,2,3,4,5,6,7,8,9,10}; 

    BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric(a); 
    System.out.println("BinarySearch Generic: " + binarySearchGeneric.search(a, 8)); 

    } 
} 
+1

不是問題,但考慮搜索一個'List '而不是'T []'。 –

+2

你不能使用基本類型的泛型,使用'Integer []'而不是'int []' –

+0

另外:不要使用原始類型:'BinarySearchGeneric '。 –

回答

2

這裏有兩個編譯問題:

  1. 沒有構造函數BinarySearchGeneric它接受一個參數,但你試圖傳遞參數。刪除:

    BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric(); 
    
  2. int[]不是一個通用的方法期望陣列的可接受的參數,因爲int是基本類型,不是引用類型,並且因此不能在泛型使用。該解決方案是簡單地聲明的Integer陣列,而不是int

    Integer[] a = {1,2,3,4,5,6,7,8,9,10}; 
    

    編譯器將這些自動詮釋文字到Integer實例。


但也有更多的問題。

  • 您聲明的變量爲raw type。這基本上關閉了與該變量關聯的編譯器的類型檢查,這可能會導致類型錯誤。添加通用參數:

    BinarySearchGeneric<Integer> binarySearchGeneric = new BinarySearchGeneric<>(); 
    
  • 陣列和仿製藥並不真正在一起玩。事情將開始變得有點混亂,如果你宣佈一個通用的,可比類:

    class GenericComparable<T> extends Comparable<T> { ... } 
    

    ,然後試圖申報GenericComparable秒的數組傳遞給binarySearchGeneric,因爲你不能直接創建一個通用的陣列。

    它更容易只是爲了避免陣列,並使用List<T>代替:

    public int search(List<T> array, T element){ 
    
  • 潛在的,你有不一致的行爲,因爲你在搜索混合equalscompareTo。雖然compareTo應符合equals(在這個意義上a.compareTo(b) <=> a.equals(b),它不一定是真正

    您可以只用compareTo做出一致的行爲。

    int c = array[mid].compareTo(element); 
    if (c == 0) { 
        // ... 
    } else if (c < 0) { 
        // ... 
    } else { 
        // ... 
    } 
    
1

我沒有看到爲BinarySearchGeneric類用戶定義的構造函數,所以你的代碼應該是這個樣子:

BinarySearchGeneric binarySearchGeneric = new BinarySearchGeneric(); 
System.out.println("BinarySearch Genetic: ", binarySearchGeneric(a, 8)); 
+0

啊該死,謝謝,我有一個構造函數,並沒有改變它。現在我做了,但第二個錯誤仍然存​​在.. –

+1

@JavaMan第二個錯誤是通過使用Integer []'修復的。 –