[英]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.