2015-09-11 64 views
0

我有一個對象數組,對象包含數據成員,如GoalsFor,GoalsAgainst和MatchPoints。現在我有搜索和顯示數據使用二進制搜索方法爲給定goalsFor或goalsAgainst或MatchPoints值。 我正在做一個二進制搜索類來執行搜索操作,但目前我必須爲三個操作的對象的每個數據成員製作三個二進制搜索類。是否有一種方法可以重用二進制搜索代碼,而不是複製它三次。如何重複使用這段代碼,而不是一次又一次的複製和粘貼

這是一個家庭作業問題,但我揣測我的懷疑是比較籠統的。 約束:線性搜索不允許的,沒有內置的功能,除了I/O可我在二進制搜索的其它實現改變的僅僅是使用goalsFor和目標反對,而不是點來使用

public class BinarySearchPoints 
{ 
    public static void search(Teams arr[], int searchValue, int start , int end) 

    { 
    if(start > end) 
     return; 
    int mid = (end + start)/2; 
    if(searchValue == arr[mid].points) 
    { 
     System.out.print(arr[mid].toString()); 
     search(arr, searchValue, mid + 1, end); 
     search(arr, searchValue, start, mid - 1); 
    } 
    else if(searchValue < arr[mid].points) 
     { 
      search(arr, searchValue, mid + 1, end); 
     } 
    else 
     search(arr, searchValue, start, mid - 1); 

    } 
} 

+0

您可以將您的二進制搜索邏輯實現爲java函數,然後多次調用該函數 – pradeep

+4

您可以顯示此代碼被複制三次嗎? –

+0

請張貼您的二進制搜索代碼的一個副本,以便更容易地解釋需要更改的內容。 – dasblinkenlight

回答

0

你絕對可以概括你的二進制搜索方法。

首先要做的是考慮傳入數據集合的二進制搜索需要什麼。事實證明,它唯一需要的是能夠將數據元素與搜索值進行比較。

接下來的事情是想出一個抽象的方式來表達比較的方式,例如,作爲界面。您的界面將有一個單一的方法來回答「元素X相對於給定數字在哪裏」的問題?

您可以在Java中表示這是一個通用接口:

interface ElementComparator<E> { 
    // This assumes that you always search for an int property 
    int compare(E element, int value); 
} 

你比較方法需要返回負值,如果E的屬性小於V,正值如果大於V更大,如果兩者相等,則爲零。 V必須實現Comparable接口。

現在你binarySearch方法可以定義如下:

T binarySearch<E>(
    Collection<E> data 
, int value 
, ElementComparator<E> comparator 
) { 
    ... 
} 

決定是否去左右你需要調用comparator.compare(data.get(mid), value);和檢查結果的中間。

現在你可以打電話給你binarySearch這樣的:

List<Teams> list = ... 
Teams fivePoints = binarySearch(list, 5, new ElementComparator<Teams>() { 
    public int compare(Teams element, int value) { 
     return Integer.compare(element.points, value); 
    } 
}); 
Teams fiveAgainst = binarySearch(list, 5, new ElementComparator<Teams>() { 
    public int compare(Teams element, int value) { 
     return Integer.compare(element.against, value); 
    } 
}); 

注意如何比較回調與呼叫在線提供的:這就是魔法發生 - 當binarySearch實現需要以比較Teamvalue,它調用compare,依次調用Integer.compareelement.pointselement.against,具體取決於回調。

相關問題