Appearance
线性查找法是最简单的算法了,简单理解就是在一个数组中找我们想要的元素,需求如下:
- 输入:数组和目标元素
- 输出:目标元素所在的索引;若不存在返回-1
线性查找工具类编码实现
java
public class LinearSearch {
public static int search(int[] dataArray, int target) {
for (int i = 0; i < dataArray.length; i++) {
if (dataArray[i] == target) {
return i;
}
}
return -1;
}
}
我们能够直接调用LinearSearch类的私有方法,下面为测试代码
java
public static void main(String[] args) {
int[] dataArray = {24, 18, 12, 9, 16, 66, 32, 4};
System.out.println(search(dataArray,16));
System.out.println(search(dataArray,1));
}
工具类调用问题分析
再看如下代码,我们调用static修饰的方式是不需要去new这个对象的,可以直接调用,因此我们不想让用户去new一个LinearSearch而是直接去调用该如何做?
java
public static void main(String[] args) {
int[] dataArray = {24, 18, 12, 9, 16, 66, 32, 4};
LinearSearch ls = new LinearSearch();
System.out.println(ls.search(dataArray,16));
System.out.println(ls.search(dataArray,1));
}
工具类私有化
我们可以将这个类私有化,这样
java
public class LinearSearch {
private LinearSearch() {}
public static int search(int[] dataArray, int target) {
for (int i = 0; i < dataArray.length; i++) {
if (dataArray[i] == target) {
return i;
}
}
return -1;
}
}
使用泛型完善工具类
思考:泛型应该定义在哪里,定义在类上还是方法上?
java
public class LinearSearch {
private LinearSearch() {}
public static <E> int search(E[] dataArray, E target) {
for (int i = 0; i < dataArray.length; i++) {
if (dataArray[i].equals(target)) return i;
}
return -1;
}
}
说明:泛型不可以是基本数据类型,只能是类对象,因此我们应该使用包装类,将int改成Integer,下面是使用案例
java
@Test
public void LinearSearchTest() {
Integer[] dataArray = {24, 18, 12, 9, 16, 66, 32, 4};
System.out.println(LinearSearch.search(dataArray, 16));
System.out.println(LinearSearch.search(dataArray, 1));
}
查找对象时出现的问题
我们定义一个Student类
java
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
}
java
public void LinearSearchTest() {
Student[] dataArray = {new Student("张三"),new Student("李四"),new Student("王五")};
Student student = new Student("张三");
System.out.println(LinearSearch.search(dataArray, student));
}
通过测试我们发现,方法返回的是-1,代表没有找到"张三",这是因为equals比较对象时默认比较的是地址,我们可以重写Student的equals方法。
java
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public boolean equals(Object student) {
// 1.先看看比较的是不是同一个对象
if (this == student) return true;
// 2.判断是否为空以及是否属于同一个类
if (student == null || getClass() != student.getClass()) return false;
// 3.经过判断属于同一个类,强制转换才不会报错
Student another = (Student) student;
return Objects.equals(name, another.name);
}
}