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
,否則二分查找返回值爲負數,即表示沒找到此元素。
缺點
- 集合必須
有序
,若需要排序,那麼二分查找將沒有優勢 - 該集合不應該是鏈表(
因爲鏈表不能隨機訪問,需要遍歷一半才能找到中心點,這導致二分查找沒有優勢
),否則會將會以線性查找的方式進行查找