哈希表代码实现
public class hashtable { public static void main(String[] args) { //创建哈希表 HashTab hashTabnew HashTab(7); //写一个简单的菜单 String key; Scanner innew Scanner(System.in); while (true) { System.out.println(add:添加数据); System.out.println(list:显示雇员); System.out.println(find:查找链表); System.out.println(exit:退出系统); keyin.next(); switch (key) { case add: System.out.println(输入id); int idin.nextInt(); System.out.println(输入名字); String namein.next(); //创建雇员 Emp empnew Emp(id,name); hashTab.add(emp); break; case list: hashTab.list(); break; case exit: in.close(); System.exit(0); case find: System.out.println(输入id); idin.nextInt(); hashTab.findEmpById(id); } } } } //表示一个雇员 class Emp { public int id; public String name; public Emp next;//默认为空 public Emp(int id, String name) { this.id id; this.name name; } } //哈希表 class HashTab { int size; private EmpLinkedList[] empLinkedListArrays; //构造器 public HashTab(int size) { this.sizesize; //初始化empLinkedListArrays empLinkedListArraysnew EmpLinkedList[size]; //这里有个坑 这时不要忘了分别初始化每个链表 for(int i0;isize;i) { empLinkedListArrays[i]new EmpLinkedList(); } } //添加雇员 public void add(Emp emp) { //根据员工的id得到该员工应该加入到哪条链表 int empLinkedListNohashFun(emp.id); //将emp添加到对应的链表中 empLinkedListArrays[empLinkedListNo].add(emp); } //根据输入的id查找雇员 public void findEmpById(int id) { //根据员工的id得到该员工应该加入到哪条链表 int empLinkedListNohashFun(id); Emp empempLinkedListArrays[empLinkedListNo].findEmpById(id); if(emp!null) { //找到 } else { System.out.println(没找到); } } //编写所有的链表 遍历哈希表 public void list() { for(int i0;isize;i) { empLinkedListArrays[i].list(i); } } //编写一个散列函数,使用一个简单的取模法 public int hashFun(int id) { return id%size; } } //创建EmpLinkedList class EmpLinkedList { //头指针指向第一个雇员因此这个链表的head是直接指向第一个雇员的 private Emp head;//默认null //添加雇员到链表 //说明 //1.假定当添加雇员时id是自增长的即id总是从小到大 //因此直接将雇员加到本链表的最后一个即可 public void add(Emp emp) { //如果是添加第一个雇员 if(headnull) { heademp; return; } //如果不是第一个雇员 Emp curEmphead; while (true) { if(curEmp.nextnull) break; curEmpcurEmp.next; } //退出时直接加到链表的最后 curEmp.nextemp; } //遍历链表的雇员信息 public void list(int no) { if(headnull) { System.out.println(第no条链表为空); return; } System.out.print(第no链表的信息为:); Emp curEmphead;//辅助指针 while (true) { System.out.printf( id%d name%s\t,curEmp.id,curEmp.name); if(curEmp.nextnull) break; curEmpcurEmp.next; } } //根据id查找雇员 没有找到返回Null public Emp findEmpById(int id) { //判断链表是否为空 if(headnull) {System.out.println(链表空); return null; } Emp curEmphead; while (true) { if(curEmp.idid)break; if(curEmp.nextnull) { curEmp null;//说明没有找到 break;// } } curEmp curEmp.next; } return curEmp; } }