簡體   English   中英

Java 中的 Collections.binarySearch()

[英]Collections.binarySearch() in Java

我正在使用 binarySearch() 方法來查找列表中元素的位置。 我不明白為什么索引是-6。 我看到元素在按降序排序后位於位置 1。 有人能告訴我為什么我看到位置-6嗎? 謝謝!

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test
{
    public static void main(String[] args)
    {
        List<Integer> al = new ArrayList<>();
        al.add(100);
        al.add(30);
        al.add(10);
        al.add(2);
        al.add(50);

        Collections.sort(al, Collections.reverseOrder()); 
        System.out.println(al);

        int index = Collections.binarySearch(al, 50);

        System.out.println("Found at index " + index);
    }
}

輸出為:[100, 50, 30, 10, 2]

在索引 -6 處找到

列表必須按自然升序排序,否則結果不可預測。

來自Javadoc

使用二進制搜索算法搜索指定對象的指定列表。 在進行此調用之前,必須根據其元素的自然順序(如 sort(java.util.List) 方法)將列表按升序排序。 如果未排序,則結果是 undefined 如果列表包含多個與指定對象相等的元素,則無法保證會找到哪一個。


現在,如果你真的想知道為什么結果是 -6,你必須知道這個方法在內部是如何工作的。 它采用中間索引並檢查它是大於還是小於您要搜索的值。

如果它更大(這里就是這種情況),它會占用下半部分並進行相同的計算(低變為中,最大值保持最大值)。

最后,如果未找到鍵,該方法返回-(low + 1) ,在您的情況下為-(5 + 1)因為當無法進一步拆分時,最大索引變為低。

您必須按升序排序(根據 Collections.binarySearch 的文檔),或者將自定義比較器作為第三個參數傳遞。

int index = Collections.binarySearch(al, 50, Collections.reverseOrder());

不這樣做將導致未定義的結果。

除了需要對列表進行排序之外,二分查找

返回搜索鍵的索引,如果它包含在列表中; 否則, (-(插入點) - 1)

(Javadoc)

即:負索引指定索引的負數,如果它存在,則將在該索引處放置正在搜索的項目,減 1。

-1 表示它將被放置在索引 0

-6 表示它將被放置在索引 5 處。

是的,升序對這個算法很重要。 只需用Collections.sort(al)替換排序即可。

結果,您將擁有:

[2, 10, 30, 50, 100]
Found at index 3

暫無
暫無

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

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