员工作为节点。然后建立链表。 存的数据是员工。所有的方法是链表的方法,数组只是调用。hash中只有一个是自己实现的就是index 散列。
package a;
import java.util.Scanner;
public class MyHashTableDemo {
public static void main(String[] args) {
MyHashTable hash = new MyHashTable(6);
Scanner scanner = new Scanner(System.in);
String in ="";
boolean flag = true;
while (flag) {
System.out.println("add 添加员工");
System.out.println("show 显示员工");
System.out.println("find 寻找员工");
System.out.println("delete 删除员工");
System.out.println("exit 退出");
in = scanner.next();
switch (in) {
case "add":
System.out.println("请输入id");
int id = scanner.nextInt();
System.out.println("请输入名字");
String name = scanner.next();
hash.add(new Emp(id,name));
break;
case "show":hash.show();
break;
case "find":
System.out.println("请输入id");
id = scanner.nextInt();
Emp emp = hash.find(id);
System.out.println("emp = " + emp);
break;
case "delete":System.out.println("请输入id");
id = scanner.nextInt();
hash.delete(id);
break;
case "exit":
flag = false;
scanner.close();
// System.exit(0); //用这个可以替代那个flag
break;
}
}
}
}
class MyHashTable{
EmpLinkedList [] arr;
int size;
public MyHashTable(int size) {
this.size = size;
arr = new EmpLinkedList[size];
for (int i = 0; i < arr.length; i++) {
arr[i]= new EmpLinkedList();
}
}
public Emp find(int id) {
Emp emp = arr[index(id)].find(id);
return emp;
}
public void delete(int id) {
arr[index(id)].delete(id);
}
public int index(int num) {
return num%size;
}
public void add(Emp emp) {
arr[index(emp.id)].add(emp);
}
public void show() {
for (int i = 0; i < arr.length; i++) {
EmpLinkedList empLinkedList = arr[i];
empLinkedList.show(i);
}
}
}
class EmpLinkedList{
Emp head;
public void add(Emp emp) {
if (head == null) {
head = emp;
}else {
Emp temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = emp;
}
}
public Emp find(int id) {
if (head == null) {
System.out.println("没有找到对应的:"+id);
return null;
}
else {
Emp temp =head;
while (true) {
if (id == temp.id) {//当前的已经判断过了。
return temp;
}
if (temp.next == null) {//如果没有下一个就退出
return null;
}
temp = temp.next;
}
}
}
public void delete(int id) {
if (head == null) {
System.out.println("null怎么可能找到:"+id);
}else {
if (head.id == id) {
head = head.next;
}else {
Emp temp =head;
while (true) {
// if(temp==null)
if (temp.next == null) {
System.out.println("没有找到");
break;
}
if ( temp.next.id == id) {
if (temp.next.next != null) {
temp.next = temp.next.next;
}else {
temp.next=null;
}
System.out.println("已经删除了");
break;//这个找到之后应该删除,因为删除之后会导致少一个元素,也就是上面的判断条件失效了
}
temp = temp.next;
}
}
}
}
public void show(int i){
if (head == null) {
// System.out.println("第"+i+"条链表为空");
}else {
Emp temp = head;
System.out.print("第"+i+"条链表为:");
while (true) {
System.out.print("===>"+temp);
if (temp.next == null) {
break;
}
temp = temp.next;
}
System.out.println();
}
}
}
class Emp{
int id;
String name;
Emp next;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}