数据结构与算法——线性查找法

个人简介

个人主页: 前端杂货铺
‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
个人状态: 研发工程师,现效力于中国工业软件事业
人生格言: 积跬步至千里,积小流成江海
推荐学习:前端面试宝典 Vue2 Vue3Java基础 Vue2/3项目实战 Node.jsThree.js JS版算法
个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 一、线性查找法
    • 二、使用泛型
    • 三、使用自定义类
    • 本篇小结


一、线性查找法

基本概念:线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是 从第一个记录开始,逐个比较记录的关键字,直到和给定的 K 值相等,则查找成功;若比较结果与文件中 n 个记录的关键字都不等,则查找失败

例如:我们想在 data 数组中查找 16,那么我们可以使用线性查找法进行逐一查找

数据结构与算法——线性查找法_第1张图片

代码实现:

我们把 LinearSearch 的构造函数声明为私有的,这样在其他类中就无法调用LinearSearch。我们把 search 函数定义为静态的,这样就不需要进行实例化,而是直接通过类来调用

我们通过 for 循环遍历 data 数组,当 data 数组的索引 i 对应的值等于我们的目标值 target 时,就返回得到的索引位置,否则返回 -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 = {24, 18, 12, 9, 16, 66, 32, 4};

        int res1 = LinearSearch.search(data, 16);
        System.out.println(res1);

        int res2 = LinearSearch.search(data, 6);
        System.out.println(res2);
    }
}

数据结构与算法——线性查找法_第2张图片


二、使用泛型

上面的实现方式只是针对于 int 类型,如果我们想针对各种类型就可以使用泛型来实现

但要注意,在使用泛型时,不能存放基本数据类型,只能存放类对象

扩展:

  • equals():用来检测两个对象是否相等,即两个对象的内容是否相等
  • ==:用于比较引用和比较基本数据类型时具有不同的功能
    • (1)、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
    • (2)、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。
public class LinearSearch {
    private LinearSearch() {}
    public static <E> int search(E[] data, E target) {
        for (int i = 0; i < data.length; i++) {
            if (data[i].equals(target)) {
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
    	// 存放类对象
        Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};

        int res1 = LinearSearch.search(data, 16);
        System.out.println(res1);

        int res2 = LinearSearch.search(data, 6);
        System.out.println(res2);
    }
}

数据结构与算法——线性查找法_第3张图片


三、使用自定义类

equlas 方法默认比较的是 两个类对象的地址,如果我们希望比较两个类对象的字符串,那么 equals 就不再那么好用了,这时候我们需要 重写 equals 方法

我们期望调用 LinearSearch 方法查找 Student 类对象的字符串

public class LinearSearch {
    private LinearSearch() {}
    public static <E> int search(E[] data, E target) {
        for (int i = 0; i < data.length; i++) {
            if (data[i].equals(target)) {
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        Student[] students = {
                new Student("前端杂货铺"),
                new Student("后端杂货铺"),
                new Student("全栈杂货铺")
        };
        Student zahuopu = new Student("前端杂货铺");
        int res3 = LinearSearch.search(students, zahuopu);
        System.out.println(res3);
    }
}

由于equlas 方法默认比较的是 两个类对象的地址,所以我们需要新建 Student.java 文件,重写 equals 方法,注意重写的方法添加 @Override 注解,养成良好的编码习惯

equals 函数为 Object 父类的一个函数,我们想要覆盖 equals 方法,那么传入的参数的类型也要是 Object

加判断的是为了预防 Student another = (Student)student 强转失败抛异常

public class Student {
    private String name;
    public Student(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object student) {
    	// 判断当前类的对象是否为student对象
        if (this == student) {
            return true;
        }
        // 判断student对象是否为空
        if (student == null) {
            return false;
        }
        // 当前的类对象是否等于student的类对象
        if (this.getClass() != student.getClass()) {
            return false;
        }
        // 把 student 强制转换成 Student
        Student another = (Student)student;
        // 比较 name,下面的 equals 调用的 String 下的方法
        return this.name.equals(another.name);
    }
}

在这里插入图片描述


本篇小结

本文我们使用 Java 语言编写了线性查找法的代码,并且使用了泛型进行多种类型的适配。通过重写 equals 方法,我们熟悉了方法重写,并对加深了对类和实例的理解。

下一节,我们学习排序基础里面的 选择排序法。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. 百度百科 · Java
  2. 算法与数据结构体系【作者:bobo】

在这里插入图片描述


你可能感兴趣的:(Java数据结构与算法体系教程,Java,数据结构,线性查找法)