一、映射表(Map)简介

  1. 映射表是一种依照键/值对存储元素的容器,又称字典(directory),散列表(hash table)。
  2. 映射表将键和值一起保存,键类似于数组中的下标,不能有重复的键,每个键对应一个值
  3. 键和它对应的值构成一个条目。

二、链表实现映射表

package Map;public class LinkedListMap<K, V> implements MyMap<K, V> {//链表结点类
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() {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;
}//获取键值key所对应的结点,这个方法为后续一些方法的实现提供了方便
public Node getNode(K key) {Node current = dummyHead.next;while(current != null) {//这里不能用==,因为当key为字符串等时,判断将不准确if(key.equals(current.key)) {  return current;}current = current.next;        }return null;
}//使用头插法向映射中添加条目public void add(K key, V value) {Node node = getNode(key);if(node == null) { //映射中不存在键值为key的结点Node newNode = new Node(key,value,dummyHead.next);dummyHead.next = newNode;size++;}else//映射中存在键值为key的结点,则更新valuenode.value = value;}//查找键所对应条目是否在映射中public boolean contains(K key){Node node = getNode(key);return node != null;}//删除键值key所对应的条目public V remove(K key){Node node = getNode(key);if(node == null) //映射中不存在键值为key的条目return null;//映射中存在键值为key的条目//1. 寻找要删除结点的前一个结点Node prevNode = dummyHead;while(prevNode.next != node) {prevNode = prevNode.next;}//2. 将要删除的前一个结点和要删除结点的后一个结点相连prevNode.next = node.next;//3. 更新sizesize--;return node.value;}//获取键值为key的条目public V get(K key){Node node = getNode(key);return (node == null) ? null : node.value;}//更新某一条目public void set(K key, V newValue){Node node = getNode(key);//键所对应结点存在if(node != null) {node.value = newValue;}//键所对应结点不存在else {throw new IllegalArgumentException(key + "doesn't exists");}}//获取映射表的大小public int getSize(){return size;}//判断映射表是否为空public boolean isEmpty(){return size == 0;}//测试public static void main(String[] args) {String str = "aaaaabbbbbbcccccdddddeeeee";LinkedListMap<Character,Integer> map = new LinkedListMap<>(); for(int i = 0; i < str.length(); i++) {char key = str.charAt(i);if(map.contains(key)) {map.set(key, map.get(key) + 1);}else {map.add(key, 1);}}         System.out.println("a : " + map.get('a'));System.out.println("b : " + map.get('b'));System.out.println("c : " + map.get('c'));System.out.println("d : " + map.get('d'));System.out.println("e : " + map.get('e'));}}

数据结构之映射表(Map)---第一篇---用链表实现相关推荐

  1. 能带你起飞的【数据结构】成王第一篇:数据结构的顺序表

    目录 前言 一.什么是顺序表 1.顺序表的概念及结构 创建顺序表 打印顺序表 获取顺序表长度 在pos位置新增元素 判定是否包含某个元素 查找某个元素对应的位置 获取 pos 位置的元素 给 pos ...

  2. 2021-10-16 集合(set)与映射(map) 恋上数据结构笔记

    文章目录 集合(Listset and Treeset) 集合时间复杂度分析 Treeset的局限性 映射(Map) Map与Set 集合(Listset and Treeset) 概念:就是不存储重 ...

  3. 深入理解表单脚本系列第一篇——表单对象

    前面的话 javascript最初的一个应用就是分担服务器处理表单的责任,打破处处依赖服务器的局面.尽管目前的web和javascript已经有了长足的发展,但web表单的变化并不明显.由于web表单 ...

  4. 第一篇 数据结构、设计模式与手写代码

    目录 1.怎么理解时间复杂度和空间复杂度? 2.数组和链表结构简单对比? 3.怎么遍历一个树 4.冒泡排序(Bubble Sort) 5.快速排序(Quick Sort) 6.二分查找(Binary ...

  5. Java中的映射Map - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的映射Map - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,这里开始简单介绍下映射Map,相关类如下图所示 正 ...

  6. 字符设备驱动高级篇5——静态映射表、动态映射结构体方式操作寄存器

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.静态映射表建立过程分析 1.建立映射表的三个关键部分 (1)映射表描述 具体物理地址和虚拟地址的值相关的宏定义 ...

  7. 【数据结构 C描述】一个文本串可用事先给定的字母映射表进行加密。

    一个文本串可用事先给定的字母映射表进行加密.例如,假设字母映射表为: a b c d e f g h i j k l m n o p q r s t u v w x y z n g z q t c o ...

  8. 聊聊后端程序员的知识体系-第一篇

    聊聊后端程序员的知识体系-第一篇 原文链接:https://www.fpthinker.com/backend_knowledge_architecture/knowledge.htmll 亲爱的读者 ...

  9. 【数据结构与算法】第三篇:题型积累

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.刷题的准备与步骤 (1)第一步:先学会至少一种计算机语言.学习数 ...

最新文章

  1. 应用丨AI和机器学习如何改变美国政府决策方式
  2. PMCAFF产品众测 | 对话随手攒CEO聊聊这款产品的设计、推广和改进(活动已结束)
  3. MFC六大核心机制之一:MFC程序的初始化
  4. php搜索所有路线,php包含文件路径查找规则
  5. Python程序员每天必做的几个动作
  6. [JSP]自定义标签库taglib
  7. DynamicFusion: Reconstruction and Tracking of Non-rigid scenes in real-time
  8. kdj指标主要看哪个值_终于有人把KDJ指标总结全了,值得收藏
  9. 计算机网络与综合布线系统设计,计算机网络综合布线系统设计
  10. 第三方公众号用 微信联合 登录
  11. Windows 徽标键相关的快捷键
  12. 见一博客搬家公司 把老紫竹火龙果和我的blog全搬他家去了
  13. 人工智能如何改变联络中心座席
  14. 解决Java ,class java.lang.String cannot be cast to class java.lang.Integer
  15. 对互联网产品运营的理解
  16. Mongoose使用操作
  17. 使用Matlab2019b测试音频系统的频响(FreqResponse)与脉冲响应(ImpulseResponse)
  18. Hawk-数据抓取工具:简明教程
  19. fest3d_AssertJ Fest Hamcrest
  20. 钢管热处理市场现状研究分析-

热门文章

  1. SDL下播放声音文件
  2. Linux 命令 ps
  3. unity 摄像头跟着鼠标移动_unity第三视角移动,摄像机跟随
  4. python学习笔记(推荐有其他语言编程经验想学python的人看)
  5. 01、java02-运算符 流程控制 方法
  6. PPT——————酷炫文字、人物海报
  7. 数据库搭建范式——BC范式
  8. Java四大引用(强、软、弱、虚)
  9. 定时器轮播图---(功能:自动轮播,左右箭头点击切换,点击圆点跳转图片)
  10. 富士康将和台积电联手 竞购东芝半导体业务