哈希表实现
package com.atguigu.hashtab;import java.nio.file.NotLinkException;
import java.sql.SQLOutput;
import java.util.Scanner;/*** @創建人 wdl* @創建時間 2021/3/24* @描述*/
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("exit:退出系統");key=scanner.next();switch (key){case "add":System.out.println("輸入id");int id=scanner.nextInt();System.out.println("輸入名字");String name=scanner.next();//創建雇員Emp emp = new Emp(id, name);hashTab.add(emp);break;case "list":hashTab.list();break;case "find":System.out.println("請輸入要查找的id");id=scanner.nextInt();hashTab.findEmpById(id);break;case "exit":scanner.close();System.exit(0);break;default:break;}}}}//創建HashTab管理多條鏈表
class HashTab{private EmpLinkedList[] empLinkedListArray;private int size;//表示有多少條鏈表//構造器public HashTab(int size){this.size=size;//初始化empLinkedListArrayempLinkedListArray=new EmpLinkedList[size];//留一個坑,這時不要忘了分別初始化每一條鏈表for (int i = 0; i < size; i++) {empLinkedListArray[i]=new EmpLinkedList();}}//添加雇員public void add(Emp emp){//根據員工的id,得到該員工應當添加到哪條鏈表int empLinkedListNo=hashFun(emp.id);//將emp添加到對應的鏈表中empLinkedListArray[empLinkedListNo].add(emp);}//遍歷所有的鏈表,遍歷hashtabpublic void list(){for (int i = 0; i < size; i++) {empLinkedListArray[i].list(i);}}//根據輸入的id,查找雇員public void findEmpById(int id){//使用散列函數確定到哪條鏈表查找int empLinkedListNo = hashFun(id);Emp emp = empLinkedListArray[empLinkedListNo].findEmpById(id);if(emp!=null){//找到System.out.println("在第"+(empLinkedListNo+1)+"條鏈表中找到雇員id="+id);}else {System.out.println("在哈希表中,沒有找到該雇員");}}//編寫散列函數,使用一個簡單的取模發public int hashFun(int id){return id%size;}}//表示一個雇員
class Emp{public int id;public String name;public Emp next;//next默認為nullpublic Emp(int id, String name) {super();this.id = id;this.name = name;}}//創建一個EmpLinkedList,表示鏈表
class EmpLinkedList{//頭指針,指向第一個Emp,因此我們這個鏈表的head是直接指向第一個Empprivate Emp head;//默認null//添加雇員到鏈表//說明//1.假定,當添加雇員是,id是自增長,即id的分配總是從小到大//因此我們將雇員直接加入到本鏈表的最后即可public void add(Emp emp){//如果是添加第一個雇員if(head==null){head=emp;return;}//如果不是第一個雇員,則使用一個輔助的指針,幫助我們定位到最后Emp curEmp=head;while(true){if(curEmp.name==null){//說明到鏈表的最后break;}curEmp=curEmp.next;//后移}//退出時直接將emp加入鏈表curEmp.next=emp;}//遍歷鏈表的雇員public void list(int no){if(head==null){//說明鏈表為空System.out.println("第"+(no+1)+"條鏈表為空");return;}System.out.println("第"+(no+1)+"條鏈表的信息為");Emp curEmp=head;//輔助指針while (true){System.out.println("=>id="+curEmp.id+" name="+curEmp.name+"\t");if (curEmp.next== null){//說明curEmp已經是最后節點break;}curEmp=curEmp.next;//后移,遍歷}System.out.println();}//根據id查找雇員//如果找都就返回Emp,如果沒有找到,就返回nullpublic Emp findEmpById(int id){//判斷鏈表是否為空if(head==null){System.out.println("鏈表為空");return null;}//輔助指針Emp curEmp=head;while(true){if(curEmp.id==id){//找到break;//這時curEmp就指向要查找的雇員}//退出if(curEmp.next==null){//說明遍歷當前鏈表沒有找到該雇員curEmp=null;break;}curEmp=curEmp.next;//}return curEmp;}}
總結
- 上一篇: 如何用xshell上宝塔
- 下一篇: 二叉树的前中后序查找+思路分析