线性查找法是最简单的算法了,简单理解就是在一个数组中找我们想要的元素,需求如下:

  • 输入:数组和目标元素
  • 输出:目标元素所在的索引;若不存在返回-1

# 线性查找工具类编码实现

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类的私有方法,下面为测试代码

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而是直接去调用该如何做?

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));
}

# 工具类私有化

我们可以将这个类私有化,这样

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;
    }
}

# 使用泛型完善工具类

思考:泛型应该定义在哪里,定义在类上还是方法上?

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,下面是使用案例

@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类

public class Student {
    
    private String name;

    public Student(String name) {
        this.name = name;
    }
}
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方法。

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);
    }
}

# 在线测试