Collections.binarySearch(二分查找)的使用

Collections.binarySearch的使用要注意一下3點
  • 要查找某個元素,必須提供集合,而且這個集合必須實現List接口
  • 集合必須有序,如果沒有序,應該先排序再二分查找
  • 如果要查找的元素的類型沒有實現Comparable接口的compareTo方法進行排序,就還要提供一個比較器。(此處說明的是二分查找的2種方式)
實現Comparable接口

comparaTo的實現

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,否則二分查找返回值爲負數,即表示沒找到此元素。

缺點

  • 集合必須有序,若需要排序,那麼二分查找將沒有優勢
  • 該集合不應該是鏈表(因爲鏈表不能隨機訪問,需要遍歷一半才能找到中心點,這導致二分查找沒有優勢),否則會將會以線性查找的方式進行查找
發佈了55 篇原創文章 · 獲贊 6 · 訪問量 5044
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章