• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > java 实现对List做二分查找(支持泛型)

java 实现对List做二分查找(支持泛型)

作者:frained的专栏 字体:[增加 减小] 来源:互联网 时间:2017-08-30

frained的专栏通过本文主要向大家介绍了java,二分查找,算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

public class Main {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        for(int i = 1 ; i< 21 ; ++i){
            list.add(i);
        }

        find(1,list);

        find(20,list);

        find(15,list);

        find(6,list);
    }

    public static void find(Integer value,List<Integer> list){
        System.out.println("value ["+value+"]" + " in position : " + BinarySearch.binarySearch(list,value));
    }
}


/**
 * 二分查找
 * */
class BinarySearch {

    /**
     * @param list 有序列表
     * @param lo 查找开始位置
     * @param hi 查找的结束位置
     * @param value 查找的元素
     * @param comparator 比较器
     * @return 如果找到 返回元素value的索引,否则返回 < 0
     * */
    public static <T> int binarySearch (List<T> list,int lo,int hi,T value,Comparator<? super T> comparator){

        if(comparator == null){
            throw new IllegalArgumentException("comparable can not be null!");
        }

        if(!checkList(list)){
            return 0;
        }

        checkBinarySearchBounds(lo, hi, list.size());

        while (lo <= hi) {
            final int mid = (lo + hi) >>> 1;
            final T midVal = list.get(mid);

            if (comparator.compare(midVal,value) < 0 ) {
                lo = mid + 1;
            } else if (comparator.compare(midVal,value) > 0) {
                hi = mid - 1;
            } else {
                return mid;  // value found
            }
        }
        return ~lo;  // value not present

    }

    /**
     * @param list 有序列表
     * @param value 查找的元素
     * @param comparator 比较器
     * @return 元素 如果找到 返回元素value的索引,否则返回 < 0
     * */
    public static  <T> int binarySearch (List<T> list,T value,Comparator<? super T> comparator){
        if(!checkList(list)){ return 0; }
        return binarySearch(list,0, list.size() - 1 ,value,comparator);
    }

    /**
     * @param list 有序列表,元素必须实现了Comparable接口
     * @param lo 查找开始位置
     * @param hi 查找的结束位置
     * @param value 查找的元素
     * @return 元素 如果找到 返回元素value的索引,否则返回 < 0
     * */
    public static  <T extends Comparable<T>> int binarySearch (List<T> list,int lo,int hi, T value){

        if(!checkList(list)){
            return 0;
        }
        checkBinarySearchBounds(lo,hi, list.size());

        while (lo <= hi) {
            final int mid = (lo + hi) >>> 1;
            final T midVal = list.get(mid);

            if (midVal.compareTo(value) < 0 ) {
                lo = mid + 1;
            } else if (midVal.compareTo(value) > 0) {
                hi = mid - 1;
            } else {
                return mid;  // value found
            }
        }
        return ~lo;  // value not present

    }

    /**
     * @param list 有序列表 元素必须实现了Comparable接口
     * @param value 查找的元素
     * @return 元素 如果找到 返回元素value的索引,否则返回 < 0
     * */
    public static <T extends Comparable<T>> int binarySearch (List<T> list, T value){
        if(!checkList(list)){ return 0; }
        return binarySearch(list,0, list.size() - 1 ,value);
    }

    /**
     * @param list true代表list非空,否则为false
     * */
    private static boolean checkList(List list){
        return list != null && !list.isEmpty();
    }

    private static void checkBinarySearchBounds(int startIndex, int endIndex, int length) {
        if (startIndex > endIndex) {
            throw new IllegalArgumentException();
        }
        if (startIndex < 0 || endIndex > length) {
            throw new ArrayIndexOutOfBoundsException();
        }
    }
}

输出结果:

value [1] in position : 0
value [20] in position : 19
value [15] in position : 14
value [6] in position : 5
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • JavaThreadPoolExecutor线程池调度器
  • 全面掌握Java内部类
  • Java中的常用阻塞队列源码分析
  • Java虚拟机(四)垃圾收集算法
  • Java内存模型与线程
  • Java中如何优雅正确的终止线程
  • [译]深入字节码操作:使用ASM和Javassist创建审核日志
  • IntelliJIDEA平台下JNI编程(五)—本地C代码创建Java对象及引用
  • 【java总结】设计模式详解
  • Java代码中常见技术债务处理之Exception

相关文章

  • 2017-05-28Java 中 Reference用法详解
  • 2017-05-28java 汉诺塔详解及实现代码
  • 2017-05-28java web过滤器处理乱码
  • 2017-05-28java application maven项目打自定义zip包实例(推荐)
  • 2017-05-28AspectJ的基本用法
  • 2017-05-28Java二分法查找_动力节点Java学院整理
  • 2017-05-28面向对象编程:Java中的抽象数据类型
  • 2017-05-28java实现输出字符串中第一个出现不重复的字符详解
  • 2017-05-28Java追加文件内容的三种方法实例代码
  • 2017-05-28Java HelloWorld原理分析_动力节点Java学院整理

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解SpringBoot Schedule配置
    • spring cglib 与 jdk 动态代理
    • 详解在Spring Boot中使用JPA
    • Java方法重写_动力节点Java学院整理
    • 详解SpringMVC 自动封装枚举类的方法
    • 浅谈java中的路径表示
    • 详解redis与spring的整合(使用缓存)
    • Java synchronized关键_动力节点Java学院整理
    • 详解spring中使用Elasticsearch的代码实现
    • Java中的几种读取properties配置文件的方式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有