一、思路分析
二、代码部分
2.1 员工类
//雇员类
class Employee {
public int id;
public String name;
public Employee next;
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
2.2 链表的操作类
class EmpLinkedList{
private Employee head;//此链表是不带头节点
}
2.3 操作类中的增删改查方法
2.3.1 添加
第一种:不按顺序添加,默认添加顺序为链表的末尾
public void add(Emp emp) {
if (head == null) {
head = emp;
return;
}
Emp curHead = head;//定义一个辅助指针
while (true) {
if (curHead.next == null) {
break;
}
curHead = curHead.next;//后移指针
}
//当while循环结束时,代表指针指在链表末尾
curHead.next = emp;
}
第二种 按顺序添加 ,此代码根据id大小进行添加
public void add(Employee emp) {
if(head==null){
head=emp;
return;
}
Employee curHead=head;
while (true){
if (head.next==null){
if (head.id> emp.id){
head=emp;
emp.next=curHead;
break;
}else{
head.next=emp;
break;
}
}else {
if (curHead.next.next==null){
if (curHead.next.id<emp.id){
curHead.next.next=emp;
break;
}else {
if (curHead.id>emp.id){
head=emp;
emp.next=curHead;
break;
}
emp.next=curHead.next;
curHead.next=emp;
break;
}
}
}
curHead=curHead.next;
}
}
由于本人技术不够精湛,若写的代码不够完美,希望各路大神可以帮做指导
2.3.2 根据指定id查找信息
public Emp findEmp(int id) {
if (head == null) {
System.out.println("请先向链表添加数据");
}
Emp curHead = head;
while (true) {
if (curHead.id == id) {
return curHead;
}
if (curHead.next == null) {
curHead = null;
break;
}
curHead = curHead.next;
}
throw new RuntimeException("找不到该员工的信息");
}
2.3.3 根据指定id删除员工信息
public void delete(int id) {
if (head == null) {
System.out.println("链表为空,不能删除");
return;
}
if (head.id == id) {
head = head.next;
return;
}
Emp curHead = head;
while (head.next != null) {
if (head.next.id == id) {
head.next = head.next.next;
break;
}
curHead = curHead.next;
}
}
2.3.4 查看所有员工信息
public void list(int i) {
if (head == null) {
System.out.println("第" + (i + 1) + "条链表为空");
return;
}
System.out.print("第" + (i + 1) + " 链表的信息为");
Emp curHead = head;//定义一个辅助指针
while (true) {
System.out.print("=》id=" + curHead.id + " name=" + curHead.name);
if (curHead.next == null) {
break;
}
curHead = curHead.next;
}
System.out.println(
);
}
3.哈希表:本人的思路是将他看作成一个数组,实际上操作链表的增删改查是通过该类进行操作
//管理多个链表的类,实际操作链表即哈希表
class HashTable {
private EmpLinkedList[] empLinkedListArr;
private int size;
public HashTable(int size) {
this.size = size;
empLinkedListArr = new EmpLinkedList[size];
//注意点 目前empLinkedListArr这个数组存放都是null值,因为没有对里面的链表进行实例化
//所以要实例化
for (int i = 0; i < empLinkedListArr.length; i++) {
empLinkedListArr[i] = new EmpLinkedList();
}
}
public void add(Emp emp) {
//先得到当前员工对应的散列函数值
int functionValue = hashFunction(emp.id);
empLinkedListArr[functionValue].add(emp);
}
public void list() {
for (int i = 0; i < empLinkedListArr.length; i++) {
empLinkedListArr[i].list(i);
}
}
public void findEmp(int id) {
int functionValue = hashFunction(id);
Emp emp = empLinkedListArr[functionValue].findEmp(id);
System.out.println(emp);
}
public void delete(int id) {
int functionValue = hashFunction(id);
empLinkedListArr[functionValue].delete(id);
}
//散列函数,通过散列函数计算出要将此id值的员工存放在哪一个链表上 即:计算结果为3 就代表放在第三条链表上
//最简单的散列函数计算方法 取模运算
public int hashFunction(int id) {
return id % size;
}
}
4.主界面代码
public static void main(String[] args) {
HashTable hashTable = new HashTable(7);
System.out.println("欢迎来到雇员系统:");
String key;
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("add: 添加雇员");
System.out.println("list: 查看雇员");
System.out.println("findEmp: 查找雇员");
System.out.println("delete: 删除雇员");
System.out.println("exit: 退出系统");
System.out.print("请输入你的选择:");
key = scanner.next();
switch (key) {
case "add":
System.out.println("输入要添加的员工号:");
int id = scanner.nextInt();
System.out.println("输入要添加的员工姓名:");
String name = scanner.next();
hashTable.add(new Emp(id, name));
break;
case "list":
System.out.println("所有信息为:");
hashTable.list();
break;
case "exit":
scanner.close();
System.exit(0);
break;
case "delete":
System.out.println("输入要删除的员工号:");
id = scanner.nextInt();
hashTable.delete(id);
break;
case "findEmp":
System.out.println("输入要查找的员工号:");
id = scanner.nextInt();
hashTable.findEmp(id);
break;
default:
break;
}
}
}
三、总结部分
哈希表是一种重要的存储方式,博主也是刚入门不久,技术不是很精湛,刚刚接触到哈希表时也比较懵圈,通过画了几次思路图才慢慢明白了其原理;代码写的也比较繁琐,希望有大神可以帮忙指导更改!