java哈希表 除留余数法 单链表地址法
我用eclipse做的,有三个.class文件
Node节点类
package _2200360217chap11;
public class HashNode {
String data;
HashNode next;
public HashNode(String data) {
this.data=data;
}
}
哈希表主类
package _2200360217chap11;
import java.util.Random;
public class HashTable {
HashNode[] arr;
int len;
//初始化init /构造函数
public HashTable(int len) {
this.len=len;
arr=new HashNode[len];
}
//哈希函数(除留余数法)
public int turntoHash(String data) {
//先把string转化为char[]
char[] c=data.toCharArray();
//再把char[]第一位转化为int
int key=c[0];
//再除以一个常数,这个常数通常为储存空间大小
int index=key%len;
// System.out.println("data:"+data+"index:"+index);//检查下哈希函数是否正常运行
return index;//这样就可以处理不止是int类型的数据了
// //直接定址法
// double a=0.3,b=0.7;
// return (int)(a*key+b);
// //平方取中法
// String str=Integer.toString(key*key);
// char[] c=str.toCharArray();
// return (int)(c[c.length/2]);
// //数字分析法
//
// //折叠法
//
// //随机数法
// Random random=new Random(key);//这个key就是种子,种子固定,则随机数固定
// return random.nextInt(10);//10返回的范围是0~9
}
//添加函数
public void add(String data) {
HashNode hNode=new HashNode(data);
int index=turntoHash(data);
if(arr[index]==null) {//如果第一次查找就未存放数据,那就直接储存
arr[index]=hNode;
}
else {//不然,单链表往下查找,直到单链表为null为止
HashNode temp=arr[index];
while(temp.next!=null) {
temp=temp.next;
}
temp.next=hNode;
}
}
//查找函数
public void find(String target) {
int index=turntoHash(target);//运用哈希函数,得到一个下标/哈希值
HashNode temp=arr[index];
while(temp!=null&&temp.data!=target) {
temp=temp.next;//继续往下查找(单链表查找)
}
if(temp==null)System.out.println("找不到"+target);//查找不到
else System.out.println("找到了"+target);//找到了
}
//删除函数
public void delete(String target) {
int index=turntoHash(target);//得到哈希值
if(arr[index]==null) {
System.out.println("没有"+target+"删啥删");//甚至连节点都没有,haha
}
else {
//待删除目标是首节点
if(arr[index].data==target) {
arr[index]=arr[index].next;//把下一个节点提前(可能拉了个null上来)
System.out.println("删除"+target+"成功");
}
//不是首节点呢
else {
HashNode temp=arr[index];//一个变量,方便递推
while(temp.next!=null) {
if(temp.next.data==target) {
temp.next=temp.next.next;
System.out.println("删除"+target+"成功");
break;
}
else {
temp=temp.next;
}
}
}
}
}
//显示数据是怎么存放的
public void show() {
for(int i=0;i<len;i++) {
System.out.print("["+i+"]");
HashNode temp=arr[i];//老temp了,懂得
while(temp!=null) {
System.out.print(">>>"+temp.data+" ");
temp=temp.next;
}
System.out.println();
}
}
}
测试test类
package _2200360217chap11;
import java.util.Scanner;
public class test_HashTable {
public static void main(String[] args) {
HashTable hTable=new HashTable(10);
System.out.println("构造成功!");
//测试添加
hTable.add("李俊华");
hTable.add("1");
hTable.add("a");
hTable.add("A");
hTable.add("ljh");
hTable.add("李云龙");
hTable.add("12");
hTable.add("123");
hTable.add("超级长的句子");
//测试显示
System.out.println("显示哈希表内容:");
hTable.show();
//测试查找
hTable.find("ljh");
hTable.find("notljh");
//测试删除
hTable.delete("ljh");
hTable.delete("notljh");
System.out.println("显示哈希表内容:");
hTable.show();
//以下给老师自己自己添加数据
String str;
Scanner sc = new Scanner(System.in);
System.out.print("两次enter结束输入!");
while(true) {
System.out.print("请输入要添加的数据:");
str=sc.nextLine();
if(str.equals("")) {
System.out.println("输入结束");
break;
}
else {
hTable.add(str);
}
}
System.out.println("显示哈希表内容:");
hTable.show();
}
}
运行结果
声明:我学习(抄)这个作者的他的网址