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

2023-11-07

一、映射表(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的结点,则更新value
			node.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. 更新size
		size--;
		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'));
	}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 链表【1】

    文章目录 2 两数相加 1 题目 2 算法原理 3 代码实现 445 两数相加 II
  • 链表【2】

    文章目录 24 两两交换链表中的节点 题目 算法原理 代码实现 143 重排链表
  • 算法题-简单系列-05-两个链表的第一个公共结点

    文章目录 1 题目 1 1 思路1 循环遍历 1 题目 输入两个无环的单向链表 找出它们的第一个公共结点 如果没有公共节点则返回空 1 1 思路1 循环遍历 使用两个指针N1 N2 一个从链表1的头节点开始遍历 我们记为N1 一个从链表2的
  • 算法题-简单系列-01-链表反转

    文章目录 1 题目 1 1 使用栈解决 1 2 反转链表 1 题目 给定一个单链表的头结点pHead 该头节点是有值的 比如在下图 它的val是1 长度为n 反转该链表后 返回新链表的表头 如当输入链表 1 2 3 时 经反转后 原链表变为
  • Radix Tree用法

    目录 一 radix tree定义 二 radix tree操作 参考资料 一 radix tree定义 对于长整型数据的映射 如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题 radix树就是针对这种稀疏的长整型数据查找 能快
  • D (1173) : A DS二叉树_合并二叉树

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 给定两个二叉树 输出这两个二叉树合并后形成的二叉树 依次输出前序遍历 中序遍历 后序遍历 二 输入与输出 1 输入 第一行输入t 表示有t个测试样例 第
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • c 关于数组几个查序程序

    1 查询某元素是否在数组中 int main void char i 10 2 1 7 2 10 5 2 0 1 4 10 10 1 3 1 0 8 char z 10 1 2 3 4 1 4 6 8 0 9 int zz 0 标志位 0
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • leetcode 560. 和为 K 的子数组(优质解法)

    代码 class Solution public int subarraySum int nums int k int length nums length key 表示前缀和 value 表示个数 HashMap
  • 【华为OD】给定一个整数数组nums,请你在该数组中找出两个数,使得这两个数 的和的绝对值abs(nums[x] + nums[y])为最小值并按从小到大返回这 两个数以及它们和的绝对值

    题目描述 给定一个整数数组nums 请你在该数组中找出两个数 使得这两个数 的和的绝对值abs nums x nums y 为最小值并按从小到大返回这 两个数以及它们和的绝对值 每种输入只会对应一个答案 数组中同一 个元素不能使用两遍 输入
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 回溯算法第零篇【递归、搜索与回溯】【回溯算法入门必看】

    本篇文章的目的 1 给小伙伴们对回溯算法中的名词进行解释 2 消除递归的恐惧 回溯是递归的一个分支 给小伙伴们一个建议 整篇文章都要看完 一字不漏 全是干货 注意 分析回溯的思想之前 我们得知道一个关系 递归包含搜索 搜索包含回溯 所以我们
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • LeetCode 2397. 被列覆盖的最多行数,状态压缩优化回溯法

    一 题目 1 题目描述 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆盖 则认为这
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到
  • 搜索二叉树(BSTree)

    一 搜索二叉树的概念 二叉搜索树又称为做二叉排序树 二叉查找树 其要么是一棵空树 要么是一个满足以下性质的二叉树 若它的左子树不空 则左子树上所有结点的关键字均小于根结点关键字 若它的右子树不空 则右子树上所有结点的关键字均大于根结点关键字
  • 数据结构——排序

    前言 哈喽小伙伴们好久不见 也是顺利的考完试迎来了寒假 众所周知 不怕同学是学霸 就怕学霸放寒假 假期身为弯道超车的最佳时间 我们定然是不能懒散的度过 今天我们就一起来学习数据结构初阶的终章 七大排序 本文所有的排序演示都为升序排序 目录
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • linux后台执行命令:&和nohup

    当我们在终端或控制台工作时 可能不希望由于运行一个作业而占住了屏幕 因为可能还有更重要的事情要做 比如阅读电子邮件 对于密集访问磁盘的进程 我们更希望它能够在每天的非负荷高峰时间段运行 例如凌晨 为了使这些进程能够在后台运行 也就是说不在终
  • Windows远程deepin系统

    1 deepin安装xrdp软件 apt get install xrdp 注意 出现无法定位软件包错误的 更改deepin源 更改deepin源 跟改源之前最好备份 备份命令cp sources list etc apt sources
  • openpyxl表格

    import openpyxl 引入模块 wb openpyxl Workbook 实例化表格方法 word wb active 把表格赋值给word word A1 1 这样就可以用word来操作表格了 可以写入数据 word B2 LO
  • 使用ddt执行数据驱动测试

    所谓数据驱动测试 简单的理解为数据的改变从而驱动自动化测试的执行 最终引起测试结果的改变 通过使用数据驱动测试的方法 可以在需要验证多组数据测试场景中 使用外部数据源实现对输入输出与期望值的参数化 避免在测试中使用硬编码的数据 这种方法对于
  • eslint报错解决方案:--fix的使用

    vue项目中使用eslint来做代码规范检查时 在每次运行项目后就会指出你代码中的各种不规范的地方 各种红彤彤的报错 我滴妈 虽说不影响项目运行 但是作为一个程序猿 我接受不了 解决方案 遇到问题 不要慌 报错信息放到百度翻译看一看先 可以
  • 实验一:时间数据可视化

    上图代码如下 import pyecharts options as opts from pyecharts charts import Polar Page import csv filename hot dog places csv d
  • [转]详述DHCP服务器的三种IP分配方式

    DHCP就是动态主机配置协议 Dynamic Host Configuration Protocol 它的目的就是为了减轻TCP IP网络的规划 管理和维护的负担 解决IP地址空间缺乏问题 这种网络服务有利于对网络中的客户机IP地址进行有效
  • 函数参数是右值引用类型,能够接受什么样的参数输入

    假设我们有一个函数 class Data void func Data data 那么func能接收什么样的参数输入 情形一 Data data func data Error cannot bind Data lvalue to Data
  • JAVA项目流程

    1 项目启动 1 项目组成立 公司成员 客户成员 2 制定项目预期目标 3 制定项目计划周期 4 建立好项目组成员沟通机制 2 需求调研 1 创建调研计划 协调调研时间 2 收集客户资料 获取客户需求 所有的资料都需要保留一份 资料中存疑的
  • keras的backend 设置 tensorflow,theano

    win7 系统环境安装步骤 1 首先是安装Python 建议安装anaconda 2 安装完anaconda后打开anaconda promp命令行promp 输入conda list 可以看到已经安装的库以及版本等信息 注意此时没有ker
  • Zookeeper - 本地安装与参数配置

    目录 零 前置 1 工作机制 2 Zookeeper特点 3 数据结构 一 下载 二 本地安装 1 安装JDK 2 安装Zookeeper 三 运行测试 很尴尬的一点 手贱把Zookeeper拼错了 大家自己注意一下 当然你也可以选择一直复
  • chromium主要功能模块描述

    1 base 基础模块 放最基本的操作封装 2 ash aura she ll 3 breakpad 崩溃捕捉 4 chrome 所有功能都在该模块工程下 5 cryoto 加密和解密 6 nataive libary 代替activex的
  • 更改npm镜像源

    看后面那么多404想必是因为网络引起 安装出错 于是于是去查了一下 原来npm 也像Linux的软件一样有自己的镜像源 感觉不错 虽然也存在依赖关系 非常不错 下面就是切换npm镜像源的方法有三种 1 通过config命令 npm conf
  • 扫描效果图像增强

    原文 https blog csdn net pleasecallmewhy article details 8776998 感谢 机器视觉 图像算法 https home cnblogs com u cvdream 没有扫描仪怎么办 可以
  • FreeBSD12.1系统安装完成后配置ssh远程连接

    默认情况下 freebsd12 1系统安装完之后 是禁止root通过ssh远程登录的 freebsd12 1只允许普通用户通过ssh登录 这可能也是官方推荐的做法 相对来说更加安全 但xshell工具无法用普通用户通过ssh远程连接 需要开
  • 开机直接进入该应用作为默认launcher(霸屏)或者开机自启指定应用

    开机默认此app作为launcher首次加载 就是设置这个apk为开机向导 并没有设置这个成默认launcher 若此应用是launcher应用那么按返回之后会提示让你选择哪一laucher前提是此应用内置并没有作为launcher应用 就
  • 交换两个数整有几种途径

    原本以为利用变量或者异或可以交换两个整数 今天学到 加减也可以实现两个整数的交换 本笔记适合熟悉一种编程语言的 coder 翻阅 学习的细节是欢悦的历程 Python 官网 https www python org Free 大咖免费 圣经
  • 出现ModuleNotFoundError: No module named ‘pydotplus‘的解决方法

    目录 问题描述 解决方法 安装对应的pydotplus安装包 总结 问题描述 出现ModuleNotFoundError No module named pydotplus 的解决方法 解决方法 安装对应的pydotplus安装包 cond
  • linux glob函数man页与实例

    Linux Programmer s Manual NAME glob globfree find pathnames matching a pattern free memory from glob SYNOPSIS include
  • 数据结构之映射表(Map)---第一篇---用链表实现

    一 映射表 Map 简介 映射表是一种依照键 值对存储元素的容器 又称字典 directory 散列表 hash table 映射表将键和值一起保存 键类似于数组中的下标 不能有重复的键 每个键对应一个值 键和它对应的值构成一个条目 二 链