对于线性查找法,大一的时候觉得很简单,现在在重新学一下:
在Java中线性查找仅有数组。
1.最基础的线性查找法:
=========================================================
public class LinearSearch {
public int search(int[]data,int target){
for (int i=0;i<data.length;i++){
if (data[i]==target){
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] data={46,36,95,11,2,66,69,49,22,135,0};
int result=LinearSearch.search(data,49);
System.out.println("结果位置为:"+result);
}
}
=========================================================
在此代码中只能实现int这一种类型的,并且要创建 LinearSearch 类之后才能调用 search函数。
但是有时 你不想 该类 被 别人创建,想要直接使用 该类的 search函数,所以要使用 private 和 static 。
2.进阶1的线性查找法:
=========================================================
public class LinearSearch {
private LinearSearch(){ }
public static int search(int[]data,int target){
for (int i=0;i<data.length;i++){
if (data[i]==target){
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] data={46,36,95,11,2,66,69,49,22,135,0};
// LinearSearcher ls=new LinearSearcher();
int result=LinearSearch.search(data,49);
System.out.println("结果位置为:"+result);
}
}
=========================================================
在LinearSearch 里添加一个 私有的构造函数,这样别的类就不能创建 LinearSearch 对象,
并且在 search 函数前添加了 static 关键字,这样LinearSearch.search()就可以访问了。
但此时还有一个缺点,Java的基本数据类型有8中,此代码只能实现一种,并且用户还可以自定义类,每个自定义类都可以看成一种类型,
不可能想要用几个类查询,就创建几个LinearSearch类,并修改 search()中的数组类型 ,这是绝对不被允许的。
所以要使用泛型。
3.进阶2的线性查找法:
=========================================================
public class LinearSearch { private LinearSearch(){ } //<E>表示 search()是一个泛型方法,int 表示返回值是int类型,不冲突 // 这里的数组 data 和 target 都是泛型类 public static <E> int search(E[]data,E target){ for (int i=0;i<data.length;i++){ //注意:这里用的是 equals()方法,不再是 ==
//为什么会用equals()方法? 首先这用了泛型, // 1. 对于Java基本类型要使用对应的包装类(包装类都重写了equals方法,比较的是他们的值是否相等), // 2.若是自定义类,创建自定义类的人也要重写equals方法,所以要用equals方法 //关于 Java中equals和==的区别,我觉得这篇文章写得不错: https://www.cnblogs.com/kotete/p/7001738.html if (data[i].equals(target)){ return i; } } return -1; } public static void main(String[] args) { String[] data={"46","65","69","11","2","66","69","49","22","135"}; //上面规定 data 和 target 都是泛型类,所以 data必须是对象类型,至于"65" 是Java的基本类型,会自动的转成对应的包装类 int result=LinearSearch.search(data,"65"); System.out.println("结果位置为:"+result); } }
=========================================================
但是该算法还是有缺陷,equals方法,Java的基本类型对应的包装类都重写了,但是对于自定义的类,要创建自定义类的人在该自定义类中重写equals方法,这不是线性查找法的义务。
4.进阶3的线性查找法:
自定义一个student类:
=========================================================
public class Student {
//只设置一个属性
private String name;
public Student(String name){
this.name=name;
}
@Override
public boolean equals(Object student){
if (this==student){
return true;
}
if (student==null){
return false;
}
if (this.getClass()!=student.getClass()){
return false;
}
//直接将 Object类转成Student类可能出现异常,所以有了上面三个if语句
Student another=(Student) student;
return this.name.equals(another.name);
}
}
=========================================================
在这个student类中只有一个name属性,但是重写了equals()方法,主要是看equals()方法的。
接下来是LinearSearch 类:
=========================================================
public class Student {
//只设置一个属性
private String name;
public Student(String name){
this.name=name;
}
@Override
public boolean equals(Object student){
if (this==student){
return true;
}
if (student==null){
return false;
}
if (this.getClass()!=student.getClass()){
return false;
}
//直接将 Object类转成Student类可能出现异常,所以有了上面三个if语句
Student another=(Student) student;
return this.name.equals(another.name);
}
}
=========================================================
这样就定了一个模板,如果自定义类就按照Student类这样
写,属性不同,就修改要比较的属性名,如果有多个属性要比较,就用&&。