java实现哈希表

上代码就完事了,对了,用的是链地址法解决冲突

这个是他娘的哈希表

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;
		}	
	}
	


}

猜你喜欢

转载自blog.csdn.net/hrwy2920566283/article/details/81070366