HashTab基于链表简单实现(java,不包含扩容)

简介: HashTab基于链表简单实现(java,不包含扩容)

一、文件目录

二、代码

 
/**
 * 定义一个雇员
 */
public class Emp {
    public int id;
    public String name;
    //默认为null
    public Emp next;
 
    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
 
/**
 * 表示链表
 */
public class EmpLinkedList {
    //    头指针,指向第一个Emp,默认为null
    private Emp head;
 
    /**
     * 添加雇员
     *
     * @param emp
     */
    public void add(Emp emp) {
        //添加第一个元素
        if (head == null) {
            head = emp;
            return;
        }
        Emp cur = head;
        while (cur.next != null) {
            cur = cur.next;
        }
        cur.next = emp;
    }
 
    /**
     * 输出链表内容
     */
    public void list(int no) {
        if (head == null) {
            System.out.println("当前" + no + "链表为空");
            return;
        }
        System.out.println("当前" + no + "链表的信息为:");
        //辅助指针
        Emp cur = head;
        while (true) {
            System.out.printf("=》id=%d name=%s\t", cur.id, cur.name);
            if (cur.next == null) {
                break;
            }
            cur = cur.next;
        }
        System.out.println();
    }
 
    /**
     * 根据id查找雇员
     * @param id
     * @return
     */
    public Emp findEmpById(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return null;
        }
        Emp cur = head;
        while (cur != null) {
            if (cur.id == id) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }
    public void del(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        Emp cur = head;
        //删除的位于第一个
        if(head.id==id){
            head=head.next;
            return ;
        }
        while (cur.next != null) {
            if (cur.next.id == id) {
                cur.next=cur.next.next;
                return;
            }
            cur = cur.next;
        }
    }
}
 
public class HashTab {
    private EmpLinkedList[] empLinkedList;
    private int size;
 
    public HashTab(int size) {
        //初始化
        this.size = size;
        empLinkedList = new EmpLinkedList[size];
        for (int i = 0; i < empLinkedList.length; i++) {
            empLinkedList[i] = new EmpLinkedList();
        }
    }
 
    /**
     * 添加雇员
     *
     * @param emp
     */
    public void add(Emp emp) {
        empLinkedList[hashFun(emp.id)].add(emp);
    }
 
    /**
     * 遍历所有链表
     */
    public void list() {
        for (int i = 0; i < size; i++) {
            empLinkedList[i].list(i);
        }
    }
 
    /**
     * 根据ID查找
     * @param id
     * @return
     */
    public Emp findEmpById(int id) {
        return empLinkedList[hashFun(id)].findEmpById(id);
    }
 
    /**
     * 根据ID删除
     * @param id
     */
    public void del(int id) {
        empLinkedList[hashFun(id)].del(id);
    }
 
    /**
     * 散列函数,取模法
     *
     * @param id
     * @return
     */
    public int hashFun(int id) {
        return id % size;
    }
 
}
import java.util.Scanner;
 
public class HashTabDemo {
    public static void main(String[] args) {
        //    创建哈希表
        HashTab hashTab = new HashTab(7);
        //    编写一个简单的菜单
        String key = "";
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop) {
            System.out.println("add:添加雇员");
            System.out.println("list:显示雇员");
            System.out.println("find:查找雇员");
            System.out.println("del:删除");
            System.out.println("exit:退出系统");
            key = scanner.next();
            int id;
            switch (key) {
                case "add":
                    System.out.println("输入id");
                    id = scanner.nextInt();
                    System.out.println("输入姓名");
                    String name = scanner.next();
                    hashTab.add(new Emp(id, name));
                    break;
                case "find":
                    System.out.println("输入id");
                    id = scanner.nextInt();
                    Emp empById = hashTab.findEmpById(id);
                    System.out.println(empById);
                    break;
                case "del":
                    System.out.println("输入id");
                    id = scanner.nextInt();
                    hashTab.del(id);
                    break;
                case "list":
                    hashTab.list();
                    break;
                case "exit":
                    loop = false;
                    scanner.close();
                    break;
            }
        }
    }
}

三、测试

D:\ProgramFiles\Java\jdk1.8.0_241\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=55054:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\charsets.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\deploy.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\javaws.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jce.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jfr.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jsse.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\management-agent.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\plugin.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\resources.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\rt.jar;F:\myCode\java\video\DataStructures\DataStructures\target\classes org.minos.hashtab.HashTabDemo
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
1
输入姓名
1
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
2
输入姓名
2
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
8
输入姓名
8
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
15
输入姓名
15
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
22
输入姓名
22
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=1 name=1 =》id=8 name=8 =》id=15 name=15 =》id=22 name=22 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
del
输入id
22
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=1 name=1 =》id=8 name=8 =》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
del
输入id
8
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=1 name=1 =》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
del
输入id
1
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
find
输入id
2
Emp{id=2, name='2'}
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
目录
相关文章
|
3天前
|
Java
环形数组链表(java)
环形数组链表(java)
6 0
|
1月前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
31 2
|
1月前
|
存储 安全 算法
【JAVA】HashMap扩容性能影响及优化策略
【JAVA】HashMap扩容性能影响及优化策略
|
30天前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
14天前
|
存储 安全 Java
深入解析Java HashMap的高性能扩容机制与树化优化
深入解析Java HashMap的高性能扩容机制与树化优化
11 1
|
23天前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
11 2
|
23天前
|
算法 Java C语言
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
10 1
|
23天前
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
16 1
|
3天前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)
5 0
|
3天前
|
Java
双向链表增、删、改、按序号插入(java)
双向链表增、删、改、按序号插入(java)
7 0