【数据结构】Map 映射

2023-11-14

在这里插入图片描述

数据结构源码

接口

public interface Map<K, V> {

    void add(K key, V value);

    V remove(K key);

    boolean contains(K key);

    V get(K key);

    void set(K key, V value);

    int getSize();

    boolean isEmpty();

}


实现类


public class LinkedListMap<K, V> implements Map<K, V> {

    /**
     * 内部类,定义结点Node
     */
    private class Node {
        public K key;
        public V value;
        public Node next;

        public Node(K key, V value, Node next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }

        public Node(K key, V value){
            this(key, value, null);
        }

        public Node() {
            this(null, null, null);
        }

        @Override
        public String toString() {
            return key.toString() + " : " + value.toString();
        }
    }

    private Node dummyHead;

    private int size;

    public LinkedListMap() {
        dummyHead = new Node();
        size = 0;
    }


    @Override
    public void add(K key, V value) {
        Node node = getNode(key);
        if (node == null) {
            dummyHead.next = new Node(key, value, dummyHead.next);
            size++;
        }
        else {
            node.value = value;
        }
    }

    @Override
    public V remove(K key) {
        Node prev = dummyHead;
        while (prev.next != null) {
            if (prev.next.key.equals(key))
                break;
            prev = prev.next;
        }

        if (prev.next != null) {
            Node delNode = prev.next;
            prev.next = delNode.next;
            delNode.next = null;
            size--;
            return delNode.value;
        }

        return null;
    }

    @Override
    public boolean contains(K key) {
        return getNode(key) != null;
    }

    @Override
    public V get(K key) {
        Node node = getNode(key);
        return node == null ? null : node.value;
    }

    @Override
    public void set(K key, V value) {
        Node node = getNode(key);
        if (node == null) {
            throw new IllegalArgumentException(key + " doesn't exist!");
        }

        node.value = value;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    private Node getNode(K key) {
        Node cur = dummyHead.next;
        while (cur != null) {
            if (cur.key.equals(key)) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }
}


数据结构拆解

维护字段和内部类


    /**
     * 内部类,定义结点Node
     */
    private class Node {
        public K key;
        public V value;
        public Node next;

        public Node(K key, V value, Node next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }

        public Node(K key, V value){
            this(key, value, null);
        }

        public Node() {
            this(null, null, null);
        }

        @Override
        public String toString() {
            return key.toString() + " : " + value.toString();
        }
    }

    private Node dummyHead;

    private int size;
    

构造函数



    public LinkedListMap() {
        dummyHead = new Node();
        size = 0;
    }



    @Override
    public void add(K key, V value) {
        Node node = getNode(key);
        if (node == null) {
            dummyHead.next = new Node(key, value, dummyHead.next);
            size++;
        }
        else {
            node.value = value;
        }
    }



    @Override
    public V remove(K key) {
        Node prev = dummyHead;
        while (prev.next != null) {
            if (prev.next.key.equals(key))
                break;
            prev = prev.next;
        }

        if (prev.next != null) {
            Node delNode = prev.next;
            prev.next = delNode.next;
            delNode.next = null;
            size--;
            return delNode.value;
        }

        return null;
    }


    @Override
    public void set(K key, V value) {
        Node node = getNode(key);
        if (node == null) {
            throw new IllegalArgumentException(key + " doesn't exist!");
        }

        node.value = value;
    }


    @Override
    public boolean contains(K key) {
        return getNode(key) != null;
    }

    @Override
    public V get(K key) {
        Node node = getNode(key);
        return node == null ? null : node.value;
    }
    
    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    private Node getNode(K key) {
        Node cur = dummyHead.next;
        while (cur != null) {
            if (cur.key.equals(key)) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】Map 映射 的相关文章

随机推荐

  • 最全的ASCII码对照表

    十进制代码 十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 0 0 NUL 空字符 1 1 SOH 标题起始 Ctrl A 2 2 STX 文本起始 Ctrl B 3 3 ETX 文本结束 Ctrl C 4
  • 考研笔记:有关双端队列知识点的探究

    考研笔记 有关双端队列知识点的探究 双端队列是指允许两端都可以进行入队和出队操作的队列 其元素的逻辑结构仍是线性结构 将队列的两端分别称为前端和后端 在双端队列进队时 前端进的元素排在后端进的元素前面 后端进的元素排在前端进的元素的后面 在
  • (四)Loadrunner 代理录制

    1 代理录制主要是为了解决浏览器兼容性问题导致的脚本录制问题 包括录制时浏览器打不开 录制脚本为空 2 代理录制主要步骤为 lr录制选项设置代理 lr录制选择代理的exe 开启浏览器代理 代理的端口号跟loadrunner里设置的代理端口号
  • xp系统怎样安装传真服务器,如何安装windows xp传真服务器

    用XP系统接收传真 1 开始 设置 打印机和传真机 本机必须安装调制解调器 必须有电话线与之连接 2 在空白处单击右键 安装一个本地传真机打印机 如果是第一次安装 则需要选择传真设置 如果本机没有安装传真服务 需要xp的安装盘加载一些文件
  • Oracle的一些常用函数

    SQL中的单记录函数 1 ASCII 返回与指定的字符对应的十进制数 SQL gt select ascii A A ascii a a ascii 0 zero ascii space from dual A A ZERO SPACE 6
  • MySQL~DCL

    三 DCL 1 SQL分类 DDL 操作数据库和表 DML 增删改表中数据 DQL 查询表中数据 DCL 管理用户 授权 DBA 数据库管理员 DCL 管理用户 授权 2 管理用户 2 1 添加用户 语法 CREATE USER 用户名 主
  • [ Z-Stack协议分析(一)] ZMain.c函数

    Z Stack协议分析 一 main函数解析 1 Z stack的简单介绍 Z stack是一个协议栈 是由美国TI公司德州仪器公司设计的 Z Stack协议可在官网下载 我用的还是老版本 ZStack CC2530 2 3 0 1 4 0
  • 网易校园招聘c++题目--如何让new操作符不分配内存,只调用构造函数

    问题 c 中的new操作符 通常完成两个工作 分配内存及调用相应的构造函数 请问 1 如何让new操作符不分配内存 只调用构造函数 2 这样的用法有什么用 解答 要求new显式调用构造函数 但不分配内存 题目要求不能生成内存 还要调用构造函
  • random、range和len函数的使用

    random range和len函数的使用 一 random函数 1 random random 和random Random import random num random random 生成0 1的随机浮点数0 61612881836
  • douyin23.9 deviceid和iid设备注册分析

    使用23 9版本进行注册 版本多少 其实没有那么重要 老生常谈 老规矩注册接口device register不能少吧 然后要检测设备app alert check吧 之后要发app log日志包吧 当然除了只有这些接口肯定是不行啦 加密用到
  • this指针

    this定义 this 是 C 中的一个关键字 也是一个 const 指针 它指向当前对象 通过它可以访问当前对象的所有成员 例如 void Student setname char name this gt name name void
  • 什么是paxos算法

    从前有个村 老村长退休了 需要选一个新的村长 现有俩地痞 张三 和 李四 都想当村长 想当村长 至少需要获得一半以上长老的投票 如今这一届村委会有老李 老孙 老王 三位长老担任 第一天 张三依次拜访老李 老孙 老王三位长老 与他们说 选我一
  • UML类图中类与类之间的关系

    前言 在软件系统中 类不是孤立存在的 类与类之间存在相互关系 因此 需要通过 UML 来描述这些类之间的关系 类之间具有如下几种关系 关联关系 依赖关系 泛化关系 接口与实现关系 关联关系 含义 通常将一个类的对象作为另一个类的属性 表示
  • python matlibplot时如何不显示图片只保存图片

    1 查看网上的博客好像没得到需要的结果 于是查看官方文档 既然跟show有关 我就先查询 plt show 2 在see also中查看到了ioff可以禁用交互模式 而交互模式就是在创建图时就显示出图片 禁用了之后就可以只保存而不显示了 具
  • LVS + DR + Keepalived 高可用群集构建

    文章目录 一 Keepalived 概述 1 为什么需要 keepalived 2 keepalived 是什么 3 keepalived 服务重要功能 4 keepalived 高可用故障切换转移原理 5 keepalived 体系主要模
  • 关于执行上下文的学习总结

    学习总结自 https juejin cn post 6844904145372053511 heading 1 执行上下文 Execution Context 全局执行上下文 函数执行上下文 eval执行上下文 每个执行上下文会创建 词法
  • stem函数的简单应用-matlab

    stem x 去除火柴头 仅举例常用的几个函数 其他的可参考stem 还有 stem Y 将数据序列 Y 绘制为从沿 x 轴的基线延伸的针状图 各个数据值由终止每个针状图的圆指示 如果 Y 是向量 x 轴的刻度范围是从 1 至 length
  • AI浅谈

    前言 近年来 随着 Google 的 AlphaGo 打败韩国围棋棋手李世乭之后 机器学习尤其是深度学习的热潮席卷了整个IT界 所有的互联网公司 尤其是 Google 微软 百度 腾讯等巨头 无不在布局人工智能技术和市场 百度 腾讯 阿里巴
  • 1001. 害死⼈不偿命的(3n+1)猜想(15分)

    害死 不偿命的 3n 1 猜想 15分 卡拉兹 Callatz 猜想 对任何 个 然数n 如果它是偶数 那么把它砍掉 半 如果它是奇数 那么把 3n 1 砍掉 半 这 样 直反复砍下去 最后 定在某 步得到n 1 卡拉兹在1950年的世界数
  • 【数据结构】Map 映射

    数据结构源码 接口 public interface Map