线性查找法

对于线性查找法,大一的时候觉得很简单,现在在重新学一下:

在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类这样

写,属性不同,就修改要比较的属性名,如果有多个属性要比较,就用&&。

 

猜你喜欢

转载自blog.csdn.net/weixin_42528855/article/details/112131457