簡體   English   中英

Java ArrayList二進制搜索(arrayList)

[英]Java ArrayList binary search ( arrayList)

public static boolean binarySearch(ArrayList<Student> students, int search) {
    int first = 0;
    int last = students.size() - 1;
    int mid;
    while (first <= last) {
        mid = first + (last - first) / 2;
        if (search == students.getTotal(i)) {
            return true;
        } else if (students.compareTo(students.get(mid)) < 0) {
            last = mid - 1;
        } else {
            first = mid + 1;
        }
    }

    return false;
}

在這種方法中,我應該返回true ,如果search發現,和false如果search沒有找到。
但是,我無法從ArrayList檢索信息。

這里有兩個錯誤。

一處

search == students.getTotal(i)

另一個在

students.compareTo(students.get(mid))

對於第一個,我應該訪問students並比較i進行搜索,但是我無法檢索students的數據。

在第二個中,我應該知道搜索是在左側還是右側繼續進行。

誰能給我有關解決此問題的提示? 我可能知道我使用錯誤的方式獲取數據,但是我需要一個指導。

TL; DR:問題在於您使ArrayList students及其成員感到困惑。
您將方法應用於ArrayList students ,應將其應用於單個成員。

更深入的解釋:

正如@Darshan的注釋中指出的那樣, ArrayList沒有方法getTotal 即使這樣做,此代碼也將始終返回相同的值。

你可能是說

search == students.get(i).getTotal()  

這將使用第i個學生,並將getTotal()應用於該Student實例。 返回該特定學生的getTotal結果。

在第二部分中,您基本上犯了相同的錯誤:

students.compareTo(students.get(mid)) < 0)

在這里,您再次選擇ArrayList students並嘗試將方法應用於ArrayList,而不是單個學生。

解決方案再次是:從列表中選擇特定的學生(Student #i,由students.get(i)標識,然后將compareTo方法應用於該students.get(i)

ArrayLists的官方文檔在這里

首先,我認為它是mid =(first + last)/ 2。

其次,我將使用數組,因為它更容易。 但是,如果您特別想使用ArrayList,則可以執行以下操作:

public static boolean binarySearch(ArrayList<Student> students, int search) {
    int first = 0;
    int last = students.size() - 1;
    int mid;
    while (first <= last) {
        mid = ( first + last ) / 2;
        if (search == students.get(i)) {
            return true;
        } else if (search.compareTo(students.get(mid)) > 0) {
            last = mid - 1;
        } else {
            first = mid + 1;
        }
    }

    return false;
}

說明:使用ArrayList.get您只可以在要與mid元素進行比較的特定位置i上獲得ArrayList的元素。
您所犯的錯誤是,將整個列表中的students與列表中的特定元素(中間的一個)進行比較,在這里您應該將所需的值與列表的中間元素進行比較,看是否更大或更少。

暫無
暫無

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

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