哈希表(散列表)根据关键码值(Key)直接访问,加快查找的速度。
简单来说就是把数据分组,在进行查找的时候直接在对应的组里进行查找,以此减少查找数据时对不必要查找数据时所浪费的时间
package hashtab; import java.util.Scanner; public class HashTabDemo { public static void main(String[] args) { HashTab hashTab = new HashTab(7); String key = ""; Scanner scanner = new Scanner(System.in); while (true) { System.out.println("add"); System.out.println("list"); System.out.println("find"); System.out.println("del"); System.out.println("exit"); key = scanner.next(); switch (key) { case "a": int id = scanner.nextInt(); String name = scanner.next(); Emp emp = new Emp(id, name); hashTab.add(emp); break; case "list": hashTab.list(); break; case "find": id = scanner.nextInt(); hashTab.findEmpById(id); break; case "d": id = scanner.nextInt(); hashTab.deleteById(id); break; case "exit": scanner.close(); System.exit(0); default: break; } } } } class HashTab { private EmpLinkedList[] empLinkedListArray; private int size; public HashTab(int size) { this.size = size; empLinkedListArray = new EmpLinkedList[size]; for (int i = 0; i < size; i++) { empLinkedListArray[i] = new EmpLinkedList(); } } public void add(Emp emp) { int empLinkedListNO = hashFun(emp.id); empLinkedListArray[empLinkedListNO].add(emp); } public void list() { for (int i = 0; i < size; i++) { empLinkedListArray[i].list(i); } } public void findEmpById(int id) { int empLinkedListNO = hashFun(id); Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id); if (emp != null) { System.out.printf("在第%d条链表中找到 id = %d\n", (empLinkedListNO + 1), id); } else { System.out.println("no find"); } } public void deleteById(int id) { int empLinkedListNO = hashFun(id); empLinkedListArray[empLinkedListNO].delete(id); System.out.println("数据已删除"); list(); } //编写散列函数(取模法) public int hashFun(int id) { return id % size; } } class Emp { public int id; public String name; public Emp next; public Emp(int id, String name) { super(); this.id = id; this.name = name; } } class EmpLinkedList { private Emp head; public void add(Emp emp) { if (head == null) { head = emp; return; } Emp curEmp = head; while (true) { if (curEmp.next == null) { break; } curEmp = curEmp.next;//后移 } curEmp.next = emp; } public void list(int no) { if (head == null) { System.out.println("第" + (no + 1) + "条链表为空"); return; } System.out.print("第" + (no + 1) + "条链表的信息为"); Emp curEmp = head; while (true) { System.out.printf("=> id=%d name=%s\t", curEmp.id, curEmp.name); if (curEmp.next == null) { break; } curEmp = curEmp.next;//后移遍历 } System.out.println(); } public Emp findEmpById(int id) { if (head == null) { System.out.println("null"); return null; } Emp curEmp = head; while (true) { if (curEmp.id == id) { break; } //退出 if (curEmp.next == null) { curEmp = null; break; } curEmp = curEmp.next; } return curEmp; } public void delete(int id) { Emp previous = null; Emp curEmp = head; while (curEmp != null && id != curEmp.id) { previous = curEmp; curEmp = curEmp.next; } if (previous == null) { head = head.next; } else { previous.next = curEmp.next; } } }
原文:https://www.cnblogs.com/bingbug/p/12286706.html