上代码就完事了,对了,用的是链地址法解决冲突
这个是他娘的哈希表
package hashtable;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class HashTable {
public SingleLinkedList [] hashtable;
public int hash_length=8;
String text_path;
public HashTable() {//默认构造方法,初始化哈希表,但是每个单链表只有头节点
hashtable=new SingleLinkedList[hash_length];
for(int i=0;i<hash_length;i++) {
hashtable[i]=new SingleLinkedList();
}//创建空哈希表
}
public HashTable(String filepath) throws IOException {//传进去的是文件路径
this();//先创建哈希表
/**这里是文件读取方法,可能会出错**/
File file=new File(filepath);
String textLine1;//读取文件的第一行,是电话号码
String textLine2 = null;//读取文件的第二行,是姓名
String textLine3 = null;//读取文件的第三行,是家庭住址
//一次性读三行,如此反复,每三行是一个用户的信息
int key;
BufferedReader read=new BufferedReader(new FileReader(file));
try {
while((textLine1=read.readLine())!=null) {
for(int line=1;line<=3;line++) {
if(line==1) {
System.out.println(textLine1+"看看是不是读入了电弧号码");
}
else if(line==2) {
textLine2=read.readLine();
System.out.println(textLine2+"看看是不是读入了姓名");
}
else if(line==3) {
textLine3=read.readLine();
System.out.println(textLine3+"看看是不是读入了家庭住址");
}
}//一个用户读完了
key=get_key(textLine1);//获取关键字值
hashtable[key].Insret(textLine1, textLine2, textLine3,key);//把记录插入金指定的单链表之中
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
read.close();//一定要关闭IO流
}
}
public int get_key(String phone) {//触摸区域发确定关键字值,也就是哈希函数啦
int key=0;
char [] phonenumber=phone.toCharArray();
for(int i=0;i<phonenumber.length;i++) {
String str=String.valueOf(phonenumber[i]);
str.trim();
int j=Integer.parseInt(str);
//System.out.print("看看字符串转int型有没有问题"+j);
key=key+j;
}
key=key%7;
System.out.println("让我看看关键字对不对"+key);
return key;
}
public String [] search(String phonenumber) {//在哈希表上查找,传的参数是电话号码,从图形用户界面上获取啦啦啦我最帅
String[] context=new String[3];//查询的信息,有电话号码,姓名和住址
int key=get_key(phonenumber);
context=hashtable[key].search(phonenumber);//在对应的同义词单链表上去查
return context;
}
public void delete(String phonenumber) {//在哈希表上删除,传的参数是电话号码,从图形用户界面上获取啦啦啦我最帅
int key=get_key(phonenumber);
hashtable[key].delete(phonenumber);//在对应的同义词单链表上去删除
PrintHash();//每次更新了哈希表都在控制台上自动打印出来
}
public void Insert(String phonenumber,String thename,String theplace) {//在哈希表上插入一个新记录
//传的参数是电话号码,从图形用户界面上获取
int key=get_key(phonenumber);
hashtable[key].Insret(phonenumber, thename, theplace,key);//把记录插入金指定的单链表之中
PrintHash();//每次更新了哈希表都在控制台上自动打印出来
}
public void PrintHash() {//在控制台上打印哈希表
for(int i=0;i<hash_length;i++) {
hashtable[i].printList(i);//也就是打印每一个单恋比奥啦
System.out.println();
}
}
}
下边是他娘的同义词链表
package hashtable;
public class SingleLinkedList {//单链表
public Node Head;
public class Node{//节点
public String phone_number;
public String name;
public String address;
public int key;//哈希表关键字值
public Node next;
public Node() {//初始化单链表头节点
phone_number=null;
name=null;
address=null;
next=null;
key=-1;
}
public Node(String phone_number,String name,String address,int key) {
this.phone_number=phone_number;
this.name=name;
this.address=address;
next=null;
this.key=key;
}
}//节点内部类结束
public SingleLinkedList(){
Head=new Node();//创建头节点是必要的
}
public void Insret(String s1,String s2,String s3,int key) {//创建单恋表和插入新节点进单链表
Node node=new Node(s1,s2,s3,key);
node.next=Head.next;//插到头节点的后面
Head.next=node;
}
public String [] search(String str) {//在单链表上的查询操作,读入电话号码
String[] context=new String[3];//查询的信息,有电话号码,姓名和住址
Node p=Head.next;
while((p!=null)&&(!p.phone_number.equals(str))) {
p=p.next;
}
if(p==null) {
for(int i=0;i<context.length;i++) {
context[i]="没有你要查找的电话号码";}
}else {
context[0]=p.phone_number;
context[1]=p.name;
context[2]=p.address;
}
return context;
}
public void delete(String str) {//在单链表上执行删除操作,读入的也是电话号码
Node p=Head.next;
Node q=Head;//前驱节点
while((p!=null)&&(!p.phone_number.equals(str))) {
q=p;
p=p.next;
}
if(p==null) {
System.out.println("没有找到你要删除的电话号码");
return;
}else {
System.out.println("看看是不是真的找到了"+p.phone_number);//看看是不是真的找到了
q.next=p.next;//节点删除操作
}
}
public void printList(int key) {//在控制台上打印这个单链表
Node p=Head;
Head.key=key;
while(p!=null) {
System.out.print(p.phone_number+p.name+p.address+"("+p.key+")"+"——————>");
p=p.next;
}
}
}