emp.java
package day16.hash;
//雇员
public class emp {
public int id;
public String name;
public emp next;
public emp(int id, String name) {
this.id = id;
this.name = name;
}
}
emplinklist.java
package day16.hash;
public class emplinklist {
// 链表
private emp head;
// 添加雇员
// 1.假定 ;当添加雇员时id是自增,id分配从小到大。
// 将该雇员直接添加到本链表的最后即可。
public void add(emp emp){
if (head==null){ //空,直接添加
head=emp;
return;
}
emp curemp =head; //临时变量
while (true){ //判断要加入的链表的下一位是否为空,不为空则后移,为空则直接添加。
if (curemp.next==null){
break; //跳出while
}
curemp =curemp.next;//后移
}
// 退出时将emp加到链表
curemp.next=emp;
}
//遍历链表
public void list(int no){
if (head==null){
System.out.println(no+"号链表为空");
return;
}
System.out.print(no+"号链表的信息为");
emp curemp=head;
while (true){
System.out.printf("id=%d name=%s",curemp.id,curemp.name);
if (curemp.next==null){ //说明已经是最后节点
break;
}
curemp=curemp.next;
}
System.out.println();
}
// 根据id查找name.
public emp findbyid(int id){
// 判断是否为空
if (head==null){
System.out.println("链表为空");
return null;
}
emp curemp =head;//临时变量
while (true){
if (curemp.id == id){//找到
break;
}
if (curemp.next==null){
// 说明已经遍历完成,并且没有找到
curemp=null;
}
curemp=curemp.next;//把指针向后移动。
}//跳出来之后
return curemp;
}
}
//bug:如果链表为空,查找没有的值不会出错,但是如果链表不为空,查找没有的值则会报错。
hashtab.java
package day16.hash;
//思考:在hashtab类中,完成的是对emp的添加,在emplinklist中,编写了针对链表添加的方法。
public class hashtab {
// 说明: 一个hashtab是一个数组,里面包含了多条链表.
// 写了一个构造器,初始化hashtab的时候,要初始化每一个链表
// 管理多条链表
private emplinklist[] emplinklists;//数组放的是链表;
private int size; //链表的条数
// 构造器
public hashtab(int size){
this.size=size;
// 初始化emplinklistarray
emplinklists = new emplinklist[size];//这里创建了一个大小为size的数组,类型为emplinklist
for (int i=0;i<size;i++){
emplinklists[i]=new emplinklist();//给每一个链表初始化
}
}
// 添加雇员
public void add(emp emp){
//根据员工的id得到该员工应该添加到那条链表。得到一个no存放在emplinkedlistNO中。
int emplinkedlistNO =hashfun(emp.id);
//将emp添加到对应的链表
emplinklists[emplinkedlistNO].add(emp); //数组的add方法。
}
public void list(){
for (int i=0;i<size;i++){
emplinklists[i].list(i);
}
}
public void findbyid(int id){
int i = hashfun(id);//散列函数判断哪个链表查找
emp emp = emplinklists[i].findbyid(id);
if (emp!=null){
System.out.println("在"+i+"链表找到了"+emp.name);
}else {
System.out.println("没有找到改雇员");
}
}
// 编写一个散列函数,使用一个简单的取模法
public int hashfun(int id){
return id%size;
}
}
test.java
package day16.hash;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
hashtab hashtab = new hashtab(7);
// 写一个菜单
String key ="";
while (true){
System.out.println("add: 添加");
System.out.println("list: 显示");
System.out.println("exit: 退出");
System.out.println("find: 查找");
key = new Scanner(System.in).next();
switch (key){
case "add":
System.out.println("请输入id");
int id = new Scanner(System.in).nextInt();
System.out.println("请输入名字");
String name =new Scanner(System.in).next();
emp emp = new emp(id,name);
hashtab.add(emp);
break;
case "list":
hashtab.list();
break;
case "find":
System.out.println("请输入id");
id =new Scanner(System.in).nextInt();
hashtab.findbyid(id);
break;
case "exit":
System.exit(0);
break;
}
}
}
}