/**
* 哈希表实现思路 : 主要脑子里有实现链表的思路就不难。
* hash表真的像常背的面试题一样,主要构成:数组 + 链表
* 1.HashTable 比 链表 多一个hash方法(关键)
* 2.HashTable 对底层实现的链表 又包装了一层
* 3.HashTable里保存LinkedList引用。
* 4.链表 在 HashTable 里的表现形式又是 数组。
*
* PS:这只是Hash表的一个最简单实现,基于此可以继续完善。
* 至于 hash 的多种方式实现。都可以在此基础上进行完善修改。
*
*/
public class HashTabDemo {
public static void main(String[] args) {
HashTab tab = new HashTab(7);
tab.add(new Emp(1, "小李"));
tab.add(new Emp(5, "我爱罗"));
tab.add(new Emp(8, "鸣人"));
tab.add(new Emp(100, "假粉丝"));
tab.add(new Emp(1030, "桥鸟"));
tab.list();
tab.findEmpByID(100);
tab.findEmpByID(8);
tab.findEmpByID(99);
tab.delete(8);
tab.list();
System.out.println();
tab.delete(1030);
tab.delete(1);
tab.delete(100);
tab.delete(5);
System.out.println();
tab.list();
}
}
/**
* 用于测试功能的简易版员工类
*/
class Emp{
int id;
String name;
int age;
Emp next;
public Emp(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + "]";
}
}
class HashTab{
private int size;
private EmpLinkedList[] lists;
public HashTab(int size) {
this.size = size;
lists = new EmpLinkedList[size];
for (int i = 0; i < lists.length; i++) {
lists[i] = new EmpLinkedList();
}
}
public void add( Emp emp ) {
int num = hash(emp.id);
lists[num].add(emp);
}
public void list() {
for (int i = 0; i < lists.length; i++) {
lists[i].list();
}
}
public Emp findEmpByID( int id ) {
int num = hash(id);
Emp temp = lists[num].findEmpByID(id);
if( temp !=null ) {
System.out.println( "在第"+ num + "条链表中存在该雇员,雇员姓名:" + temp.name );
}else {
System.out.println( "该编号雇员不存在" );
}
return temp;
}
public boolean delete(int id) {
int num = hash(id);
return lists[num].delete(id);
}
public int hash( int id ) {
return id % size;
}
}
class EmpLinkedList{
private Emp head;
/**
* 添加元素到链表
* @param emp
*/
public void add(Emp emp) {
if( head == null ) {
head = emp;
//添加完成应该返回
return;
}
Emp temp = head;
while(true) {
if( temp.next == null ) {
break;
}
temp = temp.next;
}
temp.next = emp;
}
/**
* 显示所有链表信息
*/
public void list() {
if( head == null ) {
System.out.println( "当前链表为空~" );
return;
}
Emp curEmp = head;
while(true) {
System.out.print( curEmp + " " );
if( curEmp.next ==null ) {
break;
}
curEmp = curEmp.next;
}
System.out.println();
}
//public void update();
/**
* 根据id删除链表元素
* @param id
* @return
*/
public boolean delete(int id) {
if( head == null ) {
System.out.println("当前链表为空~");
return false;
}
Emp curPre = null;
Emp curEmp = head;
while( true ) {
if( curEmp.id == id ) {
if( head.next == null ) {
head = null;
}else {
curPre.next = curEmp.next;
}
break;
}else {
curPre = curEmp;
}
curEmp = curEmp.next;
}
return true;
}
/**
* 根据id查询链表元素
* @param id
* @return
*/
public Emp findEmpByID( int id ) {
if( head == null ) {
System.out.println( "当前链表为空" );
return null;
}
Emp emp = head;
while(true) {
if( emp.id == id ) {
break;
}
emp = emp.next;
if( emp.next == null ) {
emp = null;
break;
}
}
return emp;
}
}
【java】【HashTable】【哈希表】
最新推荐文章于 2024-08-02 18:55:05 发布