欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【java】HashTable和哈希表

程序员文章站 2022-06-17 10:22:11
/*** 哈希表实现思路 : 主要脑子里有实现链表的思路就不难。* hash表真的像常背的面试题一样,主要构成:数组 + 链表* 1.HashTable 比 链表 多一个hash方法(关键)* 2.HashTable 对底层实现的链表 又包装了一层* 3.HashTable里保存LinkedList引用。* 4.链表 在 HashTable 里的表现形式又是 数组。* * PS:这只是Hash表的一个最简单实现,基于此可以继续完善。* 至于 hash 的多种方式实现。都可以在此基础上进行....

/**
* 哈希表实现思路 : 主要脑子里有实现链表的思路就不难。
* 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;
	}
}

本文地址:https://blog.csdn.net/zhao123sun/article/details/110254183

相关标签: 数据结构