1. 程式人生 > 其它 >線性查詢法01:實現線性查詢

線性查詢法01:實現線性查詢

首先實現最基本的線性查詢整數陣列的功能

public class Algorithm {

    public static void main(String[] args) {

        int[] arr = {1, 4, 8, 1, 16};
        int target = 16;

        Algorithm ls = new Algorithm();
        
        int res = ls.search(arr, target);
        System.out.println(res);
    }

    public int search(int[] arr, int target){
        for (int i = 0; i < arr.length; i++) {
            if (target == arr[i]) {
                return i;
            }
        }
        return -1;
    }
}

進一步改進方法呼叫的便捷性,儘量建立新類,使用類名呼叫靜態方法,節省建立物件的記憶體

public class Algorithm {

    public static void main(String[] args) {

        int[] arr = {1, 4, 8, 1, 16};
        int target = 16;

        int res = LinerSearch.search(arr, target);
        System.out.println(res);
    }
}

class LinerSearch {

    /**
     * 1.如果沒有傳引數,將構造方法定義為私有型別,可以禁止其他類通過建立物件的方式來呼叫方法,節省記憶體
     */
    private LinerSearch(){}

    /**
     * 2.將方法定義為static,就可以通過類名直接呼叫方法
     */
    public static int search(int[] arr, int target){
        for (int i = 0; i < arr.length; i++) {
            if (target == arr[i]) {
                return i;
            }
        }
        return -1;
    }
}

使用泛型,將線性查詢法複用到其他資料型別陣列

public class Algorithm {

    public static void main(String[] args) {

        /**
         * 4.泛型只能接收引用型別,基本資料型別需要使用包裝類
         */
        Integer[] arr = {1, 4, 8, 1, 200};
        Integer target = 200;

        String[] str = {"a", "b", "c"};
        String target2 = "a";

        int res = LinerSearch.search(arr, target);
        System.out.println(res);

        int res2 = LinerSearch.search(str, target2);
        System.out.println(res2);
    }
}

class LinerSearch {

    /**
     * 1.如果沒有傳引數,將構造方法定義為私有型別,可以禁止其他類通過建立物件的方式來呼叫方法,節省記憶體
     */
    private LinerSearch(){}

    /**
     * 2.將方法定義為static,就可以通過類名直接呼叫方法
     * 3.將方法定義為泛型,就可以不受資料型別的限制使用該方法
     */
    public static<E> int search(E[] arr, E target){
        for (int i = 0; i < arr.length; i++) {
            /**
             * 5.此時target和arr[i]都是引用型別,==只能比較二者的地址,equals()方法才能比較內容是否相等
             * Integer型別的整數緩衝池範圍是-127~128,當在這個範圍時,==也可以正確判斷;而200不在這個範圍,因此會出錯
             */
            if (arr[i].equals(target)) {
                return i;
            }
        }
        return -1;
    }
}

對自定義類的陣列進行線性查詢,需要重寫equals()方法(Java標準類已經重寫了equals()方法,因此無需重寫)

public class Algorithm {

    public static void main(String[] args) {

        Student[] student = {new Student("xiaoming"),
                             new Student("xiaohong"),
                             new Student("xiaohua")};

        /**
         * 根據姓名查詢,重寫equals()方法,比較物件的內容而不是地址
         */
        int res = LinerSearch.search(student, new Student("xiaohua"));
        System.out.println(res);
    }
}

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

class Student {

    private String name;

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

    @Override
    public boolean equals(Object obj) {

        /**
         * 1.判斷是否相等
         */
        if (this == obj){
            return true;
        }

        /**
         * 2.判斷是否為空
         */
        if (obj == null){
            return false;
        }

        /**
         * 3.判斷是否是同一個類
         */
        if (this.getClass() != obj.getClass())
            return false;

        /**
         * 4.必須經歷上述三次判斷,強制轉換時才不會丟擲異常
         */
        Student student = (Student) obj;
        return this.name.equals(student.name);
    }
}