个人简介
个人主页: 前端杂货铺
♂️学习方向: 主攻前端方向,正逐渐往全干发展
个人状态: 研发工程师,现效力于中国工业软件事业
人生格言: 积跬步至千里,积小流成江海
推荐学习:前端面试宝典 Vue2 Vue3Java基础 Vue2/3项目实战 Node.jsThree.js JS版算法
个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧
基本概念:线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是 从第一个记录开始,逐个比较记录的关键字,直到和给定的 K 值相等,则查找成功;若比较结果与文件中 n 个记录的关键字都不等,则查找失败
例如:我们想在 data 数组中查找 16,那么我们可以使用线性查找法进行逐一查找
代码实现:
我们把 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);
}
}
上面的实现方式只是针对于 int 类型,如果我们想针对各种类型就可以使用泛型来实现
但要注意,在使用泛型时,不能存放基本数据类型,只能存放类对象
扩展:
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);
}
}
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 方法,我们熟悉了方法重写,并对加深了对类和实例的理解。
下一节,我们学习排序基础里面的 选择排序法。
好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!
参考资料:
- 百度百科 · Java
- 算法与数据结构体系【作者:bobo】