【java】【HashTable】【哈希表】


/**
* 哈希表实现思路 : 主要脑子里有实现链表的思路就不难。
* 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;
	}
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页