➢ 基本介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
➢ 实现问题
把员工的信息进行插入,不使用数据库,根据id进行查找员工的时候越快越好
➢ 思路分析图解
代码实现
首先需要定义一个员工类,包含了id和姓名以及指向下一个节点的next指针:
class Emp {
public int id;
public String name;
public Emp next;
public Emp(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
多个员工类连成一起的链表类
//EmpLinkedList 员工链表,存放员工信息
class EmpLinkedList {
private Emp head = null;
// 添加信息
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 show(int no) {
if (head == null) {
System.out.println("第 " + (no + 1) + " 条链表为空");
return;
}
System.out.print("第 " + (no + 1) + " 条链表信息为: ");
Emp curemp = head;
while (true) {
System.out.println("id:" + curemp.id + ", name:" + curemp.name);
if (curemp.next == null) {
break;
}
curemp = curemp.next;
}
// System.out.println();
}
// 根据id查找员工信息,
public Emp find(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;
break;
}
curemp = curemp.next;
}
return curemp;
}
}
但在操作过程当中,我们是对数组进行操作,而不是对链表进行操作:
class HashTable {
private EmpLinkedList[] ListArray;
private int size;
// 构造方法
public HashTable(int size) {
// 初始化链表长度
ListArray = new EmpLinkedList[size];
// 创建的数组是一个空值,初始化每一条链表
for (int i = 0; i < size; i++) {
ListArray[i] = new EmpLinkedList();
}
this.size = size;
}
// 添加
public void add(Emp emp) {
// 根据员工的id判断添加到哪条链表
int EmpLinkedListNo = hashfun(emp.id);
// 加入到链表当中
ListArray[EmpLinkedListNo].add(emp);
}
// 遍历所有链表即遍历哈希表
public void show() {
for (int i = 0; i < size; i++) {
ListArray[i].show(i);
}
}
public void find(int id) {
int EmpLinkedListNo = hashfun(id);
Emp emp = ListArray[EmpLinkedListNo].find(id);
if (emp != null) {
System.out.println("在第 " + (EmpLinkedListNo + 1) + " 条链表上存在,id为:" + id);
} else {
System.out.println("没有这个员工");
}
}
// 散列函数 取模法
public int hashfun(int id) {
return id % size;
}
}
最后定义测试:使用一个“菜单”
public static void main(String[] args) {
// 创建哈希表
HashTable hashtable = new HashTable(7);
String key = " ";
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("a : 添加员工");
System.out.println("s : 显示员工信息");
System.out.println("f : 查找员工");
System.out.println("e : 退出");
key = sc.next();
switch (key) {
case "a":
System.out.println("输入id : ");
int id = sc.nextInt();
System.out.println("输入姓名 :");
String name = sc.next();
// 创建员工
Emp emp = new Emp(id, name);
hashtable.add(emp);
break;
case "s":
hashtable.show();
break;
case "f":
System.out.println("输入id : ");
id = sc.nextInt();
hashtable.find(id);
break;
case "e":
System.exit(0);
break;
default:
System.out.println("输入有误!请重新输入。");
break;
}
}
}