数据结构--二分法查找(内含 ? super T的使用分析)
来源:互联网 发布:武钢裁员5万人 知乎 编辑:程序博客网 时间:2024/05/22 04:31
运行时间为对数!
根据年龄查找对应的人,直接上代码,有几种代码,只是在泛型时有些区别,需注意:
代码一:T 使用自己的compareTo
package com.itany.gen.superr;public class Person implements Comparable<Person>{ private int age; public Person(int age) { this.age=age; } public int getAge() { return age; } public String toString() { return "学生年龄为:"+age; } public int compareTo(Person o) { return this.age-o.age; }}
package com.itany.gen.superr;public class Test{ private final static int NOT_FOUND=-1; public static void main(String[] args) { Person[] persons={new Person(20),new Person(21),new Person(22),new Person(23),new Person(24)}; int findNum=binarySearch(persons,new Person(25)); if(findNum==NOT_FOUND) System.out.println("未找到"); else System.out.println("找到,"+persons[findNum]); } //二分法对奇偶都可以 此处的?就是T本身 也就是Person类,这是比较正常的一种 public static <T extends Comparable<? super T>> int binarySearch(T[] a,T t) { int low=0; int high=a.length-1; while(low<=high) { int mid=low+(high-low)/2; if(a[mid].compareTo(t)>0) { high=mid-1; } else if(a[mid].compareTo(t)<0) { low=low+1; } else return mid; } return NOT_FOUND; }}
代码二:T使用继承了某父类的compareTo
package com.itany.gen.super2;public class Person implements Comparable<Person>{ private int age; public Person() { } public Person(int age) { this.age=age; } public int getAge() { return age; } public String toString() { return "学生年龄为:"+age; } public int compareTo(Person o) { return this.age-o.age; }}
package com.itany.gen.super2;public class Student extends Person{ public Student(int age) { super(age); }}
package com.itany.gen.super2;public class Test{ private final static int NOT_FOUND=-1; public static void main(String[] args) { Student[] students={new Student(20),new Student(21),new Student(22),new Student(23),new Student(24)}; int findNum=binarySearch(students,new Student(19)); if(findNum==NOT_FOUND) System.out.println("未找到"); else System.out.println("找到,"+students[findNum]); } //二分法对奇偶都可以 此处的?就是T是Student类,继承自Person,但Student没有重写Person的compareTo()方法 // 此处的Comparable<? super T>就允许了这种情况,直接使用已经定义的Person implements Comparable<Person>,不需再重写Student自己的compareTo()方法 //继承的Student也是一个Comparable<? super T>,这个写法允许用和父类共有的东西来进行比较(Student也是Person),也不用强制转换 //所以这种泛型的写法允许的可能性多,推荐使用 public static <T extends Comparable<? super T>> int binarySearch(T[] a,T t) { int low=0; int high=a.length-1; while(low<=high) { int mid=low+(high-low)/2; if(a[mid].compareTo(t)>0) { high=mid-1; } else if(a[mid].compareTo(t)<0) { low=low+1; } else return mid; } return NOT_FOUND; }}小结:Comparable<? super T>这么写因为T 可能使用自己的compareTo,也有可能使用继承了某父类的compareTo,所以这样写比较规范,完整
(因为compareTo是Comparable之下的)。
注意:
还有泛型能继承和覆盖吗?这个问题是想说List<String>继承List<Object>吗?不是,它们没有继承关系。所以List<String>类型的对象不能传给List<Object>类型的参数。你必须把参数类型定义成List<? extends Object>才能接受List<String>类型的对象。参考内容:1 http://zhidao.baidu.com/link?url=ZzFE8G2v3L9tL4cr_6R_vZoYhX7U25LeNN-BjxuWKF-GgsIlazzuJ_O3TLfshZS8kf6h32_YBuy3ICneICc-8a 2 http://tieba.baidu.com/p/1615490144 3 http://hi.baidu.com/augustus_blog/item/d9331b3469b65a1d9dc65e69
0 0
- 数据结构--二分法查找(内含 ? super T的使用分析)
- 数据结构 之二分法查找
- [数据结构]二分法查找
- 图解数据结构二分法查找
- 数据结构 -- 查找之 二分法查找
- git二分法查找命令的使用
- 数据结构基础_二分法查找
- 数据结构顺序查找与二分法
- 数据结构——二分法查找
- 数据结构——二分法查找
- 数据结构与算法 二分法查找【Python与C】的实现
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 数据结构(3)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 工作笔记先-xw-server
- Laravel 曲谱 - 1.2 安装 - c) 创建 Vagrant Box
- opencv 基本数据结构
- 当我们选择工作时,什么最重要?
- const总结
- 数据结构--二分法查找(内含 ? super T的使用分析)
- 关于前端开发的20篇文档与指南
- 脚本的加载与性能
- linux系统下inittab 和 fstab 文件以及内部命令介绍
- EhCache配置
- 内存泄露的几种情况
- java实现栈及队列
- 怎样才能在创业公司做好工程师?
- VBA 去掉最大值,最小值,求方差