你可以使用
Collections.<T>binarySearch(List<T> list, T key)
对任何List 进行二分搜索。它适用于ArrayList 和LinkedList 以及任何其他List。
但是:
只有当您可以直接访问每个元素时,二分搜索才会很快:
此方法在 log(n) 时间内运行,用于“随机访问”列表(提供接近恒定时间的位置访问)。如果指定的列表没有实现 RandomAccess 接口并且很大,此方法将执行基于迭代器的二分查找,执行 O(n) 链接遍历和 O(log n) 元素比较。
如果您的 List 不提供“随机访问”,您可能会通过创建提供此功能的 List 的副本来获得更好的运气。
LinkedList<String> list = new LinkedList<String>();
// fill
要么这样
ArrayList<String> fastList = new ArrayList<String>(list);
Collections.binarySearch(fastList, "Hello World");
或者可能是这样
String[] array = list.toArray(new String[list.size()]);
Arrays.binarySearch(array, "Hello World");
如果您的List 默认没有排序,并且您必须在搜索之前对其进行排序,您可能会通过使用数组来获得最佳结果,因为
Collections.sort(list);
创建一个临时数组,该数组经过排序并用于重新创建列表,如果您直接使用数组,您应该能够防止该列表。
String[] array = list.toArray(new String[list.size()]);
Arrays.sort(array);
Arrays.binarySearch(array, "Hello World");