package DataStructureReview;
import java.util.ArrayList;
import java.util.LinkedList;
public class HashTableDemo {
public static void main(String[] args) {
//创建hashtable
HashTable hashTable = new HashTable();
//添加数据
hashTable.add(new Emp(1, "x"));
hashTable.add(new Emp(2, "y"));
hashTable.add(new Emp(3, "z"));
hashTable.add(new Emp(4, "a"));
//遍历
System.out.println(hashTable.toString());
//根据id查询元素
System.out.println(hashTable.findEmpById(2));
//根据id删除元素
System.out.println(hashTable.delete(2));
System.out.println(hashTable);
}
}
class HashTable {
private ArrayList<LinkedList> linkedlistarr = new ArrayList();
//设置哈希表链表条数
private int size = 10;
//为链表数组初始化
public HashTable() {
for (int i = 0; i < size; i++) {
linkedlistarr.add(i, new LinkedList<Emp>());
}
}
//添加数据
public void add(Emp emp) {
//根据散列函数确定数据存放在第几条链表上
linkedlistarr.get(hashFun(emp.id)).add(emp);
}
//删除数据,根据员工id删除
public boolean delete(int id) {
//获取数据存放的链表
LinkedList linkedList = linkedlistarr.get(hashFun(id));
//判断编号为id的员工是否存在
boolean flag = false;
Emp emp = null;
for (Object obj : linkedList) {
emp = (Emp) obj;
if (emp.id == id) {
flag = true;
break;
}
}
//删除元素
if (flag == true) {
linkedList.remove(emp);
}
return flag;
}
//根据id查询数据记录
public Emp findEmpById(int id) {
//获取数据存放的链表
LinkedList linkedList = linkedlistarr.get(hashFun(id));
//判断编号为id的员工是否存在
boolean flag = false;
Emp emp = null;
for (Object obj : linkedList) {
emp = (Emp) obj;
if (emp.id == id) {
flag = true;
break;
}
}
return flag ? emp : null;
}
//遍历hashtable
@Override
public String toString() {
for (int i = 0; i < size; i++) {
if (linkedlistarr.get(i).isEmpty() != true) {
for (Object obj : linkedlistarr.get(i)) {
System.out.println((Emp) obj);
}
}
}
return "";
}
//散列函数(哈希函数),给定key value 返回存储在那条链表上
public int hashFun(int id) {
//除留余数法
return id % size;
}
}
class Emp {
public int id;
private String name;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}