線性查詢法01:實現線性查詢
阿新 • • 發佈:2021-09-27
首先實現最基本的線性查詢整數陣列的功能
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);
}
}