java hashtable 数据结构_数据结构--哈希表(Java)

数据结构--哈希表(Java)

介绍

哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率

代码

package cn.guizimo.hashtab;

import java.util.Scanner;

/**

* @author guizimo

* @date 2020/7/23 10:29 下午

*/

public class HashTabDemo {

public static void main(String[] args) {

HashTab hashTab = new HashTab(7);

String key = "";

Scanner scanner = new Scanner(System.in);

while (true){

System.out.println("add:添加");

System.out.println("list:显示");

System.out.println("find:显示");

System.out.println("exit:退出");

key = scanner.next();

switch (key){

case "add":

System.out.println("输入id");

int id = scanner.nextInt();

System.out.println("输入名字");

String name = scanner.next();

Emp emp = new Emp(id, name);

hashTab.add(emp);

break;

case "list":

hashTab.list();

break;

case "find":

System.out.println("请输入id");

id = scanner.nextInt();

hashTab.find(id);

break;

case "exit":

scanner.close();

System.exit(0);

default:

break;

}

}

}

}

class Emp{

public int id;

public String name;

public Emp next;

public Emp(int id, String name) {

super();

this.id = id;

this.name = name;

}

}

//哈希表

class HashTab{

private EmpLinkedList[] empLinkedListArray;

private int size;

//构造器

public HashTab(int size){

this.size = size;

empLinkedListArray = new EmpLinkedList[size];

for (int i = 0; i < size; i++) {

empLinkedListArray[i] = new EmpLinkedList();

}

}

//添加

public void add(Emp emp){

int empLinkedListNo = hashFun(emp.id);

empLinkedListArray[empLinkedListNo].add(emp);

}

public void find(int id){

int empLinkedListNo = hashFun(id);

Emp emp = empLinkedListArray[empLinkedListNo].find(id);

if (emp != null){

System.out.printf("在第%d条链表中找到id=%d\n",(empLinkedListNo+1),id);

}else {

System.out.println("没有找到");

}

}

//遍历

public void list(){

for (int i = 0; i < size; i++) {

empLinkedListArray[i].list(i);

}

}

//散列(取模)

public int hashFun(int id){

return id % size;

}

}

class EmpLinkedList{

private Emp head;

public void add(Emp emp){

if(head == null){

head = emp;

return;

}

Emp curEmp = head;

while (true){

if(curEmp.next == null){

break;

}

curEmp = curEmp.next;

}

curEmp.next = emp;

}

public void list(int no){

if(head == null){

System.out.println("第"+(no+1)+"条链表为空");

return;

}

System.out.print("第"+(no+1)+"条链表信息");

Emp curemp = head;

while (true){

System.out.printf("id=%d,name=%s\t",curemp.id,curemp.name);

if(curemp.next == null){

break;

}

curemp = curemp.next;

}

System.out.println();

}

public Emp find(int id){

if(head == null){

System.out.println("链表为空");

return null;

}

Emp curEmp = head;

while (true){

if(curEmp.id == id){

break;

}

if(curEmp.next == null){

curEmp = null;

break;

}

curEmp = curEmp.next;

}

return curEmp;

}

}

原文链接:https://www.cnblogs.com/guizimo/p/13369611.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值