Collections.binarySearch的使用要注意一下3点
- 要查找某个元素,必须提供集合,而且这个集合必须实现
List
接口 - 集合必须
有序
,如果没有序,应该先排序再二分查找 - 如果要查找的元素的类型没有实现
Comparable
接口的compareTo
方法进行排序,就还要提供一个比较器。(此处说明的是二分查找的2种方式)
实现Comparable接口
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
class tea implements Comparable<tea>{
private int id;
public tea(int id){
this.id=id;
}
public int getId() {
return id;
}
@Override
public String toString() {
return id+"";
}
@Override
public int compareTo(tea o) {
return o.getId()-id;
}
}
public class Main {
public static void main(String[] s) {
tea[] arr = {new tea(2), new tea(3), new tea(1),new tea(5)};
List<tea> list = Arrays.asList(arr);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
int i= Collections.binarySearch(list,new tea(3));
System.out.println(i);
}
}
结果
带上比较器(元素类不实现Comparable接口)
public static void main(String[] s) {
Comparator<tea> com=(o1, o2) -> {
if (o1.getId()>o2.getId())
return -1;
else if (o1.getId()<o2.getId())
return 1 ;
else
return 0;
//return o2.getId()-o1.getId();
};
tea[] arr = {new tea(2),new tea(3), new tea(1),new tea(5)};
List<tea> list = Arrays.asList(arr);
System.out.println(list);
list.sort(com);
System.out.println(list);
int i= Collections.binarySearch(list,new tea(3),com);
System.out.println(i);
}
结果
分析
- 用二分查找元素时并不会改变列表中的顺序
- 实现
compareTo
方法时,要认识到这个方法不仅仅用于排序,同时也起到equal
的作用,所以要保证当两个元素相同时,返回0
,否则二分查找返回值为负数,即表示没找到此元素。
缺点
- 集合必须
有序
,若需要排序,那么二分查找将没有优势 - 该集合不应该是链表(
因为链表不能随机访问,需要遍历一半才能找到中心点,这导致二分查找没有优势
),否则会将会以线性查找的方式进行查找