java.util.Collections.binarySearch()方法是一个java.util.Collections类方法,该方法返回对象在排序列表中的位置。
// Returns index of key in sorted list sorted in
// ascending order
public static int binarySearch(List slist, T key)
// Returns index of key in sorted list sorted in
// order defined by Comparator c.
public static int binarySearch(List slist, T key, Comparator c)
If key is not present, the it returns "(-(insertion point) - 1)".
The insertion point is defined as the point at which the key
would be inserted into the list.
如果list的元素与指定的比较器不具有可比性,或者该元素的搜索关键字不可替代,则该方法将引发ClassCastException。
在按升序排序的列表中搜索int键:
// Java program to demonstrate working of Collections.
// binarySearch()
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class GFG
{
public static void main(String[] args)
{
List al = new ArrayList();
al.add(1);
al.add(2);
al.add(3);
al.add(10);
al.add(20);
// 10 is present at index 3.
int index = Collections.binarySearch(al, 10);
System.out.println(index);
// 13 is not present. 13 would have been inserted
// at position 4. So the function returns (-4-1)
// which is -5.
index = Collections.binarySearch(al, 13);
System.out.println(index);
}
}
输出:
3
-5
在以降序排列的列表中搜索int键。
// Java program to demonstrate working of Collections.
// binarySearch() in an array sorted in descending order.
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class GFG
{
public static void main(String[] args)
{
List al = new ArrayList();
al.add(100);
al.add(50);
al.add(30);
al.add(10);
al.add(2);
// The last parameter specifies the comparator method
// used for sorting.
int index = Collections.binarySearch(al, 50,
Collections.reverseOrder());
System.out.println("Found at index " + index);
}
}
输出:
Found at index 1
搜索用户定义的类对象的列表:
// Java program to demonstrate working of Collections.
// binarySearch() in a list of user defined objects
import java.util.*;
class Binarysearch
{
public static void main(String[] args)
{
// Create a list
List l = new ArrayList();
l.add(new Domain(10, "quiz.geeksforgeeks.org"));
l.add(new Domain(20, "practice.geeksforgeeks.org"));
l.add(new Domain(30, "code.geeksforgeeks.org"));
l.add(new Domain(40, "www.geeksforgeeks.org"));
Comparator c = new Comparator()
{
public int compare(Domain u1, Domain u2)
{
return u1.getId().compareTo(u2.getId());
}
};
// Searching a domain with key value 10. To search
// we create an object of domain with key 10.
int index = Collections.binarySearch(l,
new Domain(10, null), c);
System.out.println("Found at index " + index);
// Searching an item with key 5
index = Collections.binarySearch(l,
new Domain(5, null), c);
System.out.println(index);
}
}
// A user-defined class to store domains with id and url
class Domain
{
private int id;
private String url;
// Constructor
public Domain(int id, String url)
{
this.id = id;
this.url = url;
}
public Integer getId()
{
return Integer.valueOf(id);
}
}
输出:
0
-1
数组.binarysearch() vs Collections.binarySearch()
Arrays.binarysearch()适用于也可以是原始数据类型的数组。 Collections.binarysearch()适用于ArrayList和LinkedList之类的对象集合。
重要事项:
如果输入列表未排序,则结果不确定。
如果有重复项,则不能保证将找到哪一个。
对于ArrayList之类的“random access”列表,此方法以log(n)时间运行。如果指定的列表未实现RandomAccess接口且很大,则此方法将执行基于迭代器的二进制搜索,该搜索执行O(n)链接遍历和O(log n)元素比较。