簡體   English   中英

如何在通用程序中實現對對象數組的二進制搜索?

[英]How do you implement a binary search for object arrays in a general program?

因此,我正在學習Java,並且正在學習有關排序,搜索,算法和泛型的知識。 我正在嘗試重新創建一個接受任何類型的Comparable對象(例如ArrayList < Type >)的二進制搜索方法/類。

我了解如何使用int s,但是我真的不知道如何使用非原始類型實現它。 我認為這應該大致如下:

public class Objects<T> implements Comparable //I'm not sure about this,
//but I need to call compareTo() to compare the objects?
{
    /**
     * called from other program to find an element index in an array
     */
    public static int binSearchAll(T find, T array[])
    {
        return binarySearch(array, 0, (array.length)-1, find);
    }

    public static int binarySearch(T array[], int lower, int upper, T X)
    //x is the element to find
    {
        if (upper < lower)
            return -1;
        int middle = (lower + upper) / 2;
        if (array[middle].compareTo(X))
            return middle;
        if (array[middle] < X)
            return binarySearch(a, middle+1, upper, X);
        else
            return binarySearch(a, lower, middle-1, X);
    }
}

我試圖弄清楚如何進行這項工作,但我很茫然。 int版本中,它可以工作,但隨后僅適用於integer類型,並且不接受問題所要求的doublestring類型。

在驅動程序類中,我希望能夠創建一個新對象並像這樣使用它:

String[] str = {"a", "b", "c"};
Objects<String> s = new Objects<String>();
int indexOfB = s.binSearchAll("b", str);

或者,如果可能的話,如下所示:

String[] str = {"a", "b", "c"};
int indexOfB = Object<String>.binSearchAll("b", str);

該問題的確切措辭是:

創建一個ObjectBinarySearcher類,該類可以搜索Comparable對象的數組。 演示程序中的類,該程序在String對象數組中搜索String。

我幾乎可以肯定我對此有過多思考。

謝謝你提供的所有幫助!

這兩行是問題所在:

if (array[middle].compareTo(X))
...
if (array[middle] < X)

... compareTo返回一個int而不是一個boolean ,並且您不能在任意類型上使用< 我懷疑您已經意識到了很多,但是我只是給您一個提示:閱讀Comparable.compareTo文檔。 您需要使用compareTo而不是< ...閱讀有關返回值的文檔,以計算出需要執行的操作。

(您可能只想調用一次compareTo ,然后兩次檢查結果。如文檔所述,有三種可能的考慮方法...)

您需要模板類T實現Comparable接口。 您的實際代碼意味着只有Objects類實現該接口。 你必須轉

public class Objects<T> implements Comparable {
    //class content...
}

public class Objects<T extends Comparable<T>> {
    //class content...
}

而且,請遵循JonSkeet的答案中關於compareTo方法的建議。

您需要模板類T實現Comparable接口。 您的實際代碼意味着只有Objects類實現該接口。 你必須轉

 public class Objects<T> implements Comparable { //class content... } 

 public class Objects<T extends Comparable<T>> { //class content... } 

路易吉·門多薩

和...

這兩行是問題所在:if(array [middle] .compareTo(X))... if(array [middle] <X)... compareTo返回一個int而不是布爾值,並且您不能使用<在任意類型上。 我懷疑您已經意識到了很多,但是我只是給您一個提示:閱讀Comparable.compareTo文檔。 您需要使用compareTo而不是<...閱讀有關返回值的文檔,以計算出需要執行的操作。

(您可能只想調用一次compareTo,然后檢查兩次結果。如記錄所示,有三種可能的考慮方法...) Jon Skeet

感謝您的回答。 結合起來,我設法使程序正常工作。 現在可以使用:

String[] str = {"a", "b", "c"};
Objects<String> s = new Objects<String>();
int indexOfB = s.binSearchAll("b", str);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM