数据结构——用链表实现Map

目录

一、映射(Map)

二、代码实现

1.建立接口

2.方法实现

(1)映射的建立

键(key)和值(val)的建立

重写toString方法

(2)构造方法

(3)判断是否为空

(4)添加元素

(5)修改元素

(6)打印映射

(7)判断元素是否存在

(8)获取元素个数

(9)获取元素

(10)删除元素

3.方法调用

 三、对应题目


一、映射(Map)

映射(Maps)用于存储键值对,常见的实现有 HashMap 和 TreeMap。

在Java方法中可以直接调用

Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();

HashMap:

  • 特点: 基于哈希表实现的键值对存储结构。
  • 优点: 高效的查找、插入和删除操作。
  • 缺点: 无序,不保证顺序。

TreeMap:

  • 特点: 基于红黑树实现的有序键值对存储结构。
  • 优点: 有序,支持按照键的顺序遍历。
  • 缺点: 插入和删除相对较慢。

映射是存储数据对(key,value)的数据结构

根据键(key),寻找值(value)

二、代码实现

1.建立接口

package com.algo.lesson.lesson05.map;public interface SelfMap<K,V> {//判断集合是否为空boolean isEmpty();//获取集合中元素的个数int getSize();//判断key是否存在boolean containsKey(K key);//根据key获取值V fetValueByKey(K key);//向集合中添加元素void put(K key,V val);//删除集合中的元素(根据key删除)boolean removeByKey(K key);//修改key修改值void set(K key ,V val);//打印map集合中的所有元素【key:val】void show();
}

2.方法实现

(1)映射的建立

键(key)和值(val)的建立
K key;V val;Node next;public Node(K key, V val) {this.key = key;this.val = val;this.next = null;}public Node(K key, V val, Node next) {this(key, val);this.next = next;}private Node<K, V> head;private int size;
重写toString方法

打印的时候,为了能方便我们观察,我们可以重写toString方法,按照我们希望的格式去输出

@Overridepublic String toString() {return "[" + this.key + ":" + this.val + "]";}}

(2)构造方法

public LinkedData() {Node<K, V> dummyHead = new Node(null, null);this.head = dummyHead;this.size = 0;}

(3)判断是否为空

public boolean isEmpty() {return this.size == 0;}

(4)添加元素

头部添加

public void addHead(K key, V val) {add(0, key, val);}public void add(int index, K key, V val) {if (index < 0 || index > this.size) {throw new IllegalArgumentException("index is invalid.");}Node<K, V> node = new Node(key, val);Node<K, V> pre = this.head;for (int i = 1; i <= index; i++) {pre = pre.next;}node.next = pre.next;pre.next = node;this.size++;}

(5)修改元素

传入键和值,返回boolean类型判断是否修改成功

public boolean set(K key,V val){Node<K, V> curNode = this.head.next;while (curNode != null) {if (curNode.key.equals(key)) {curNode.val=val;return true;}curNode = curNode.next;}return false;}

(6)打印映射

@Overridepublic String toString() {Node<K, V> curNode = this.head.next;StringBuilder sb = new StringBuilder();while (curNode != null) {sb.append(curNode + "-->");curNode = curNode.next;}sb.append("null");return sb.toString();}

(7)判断元素是否存在

 public boolean contain(K key) {Node<K, V> curNode = this.head.next;while (curNode != null) {if (curNode.key.equals(key)) {return true;}curNode = curNode.next;}return false;}

(8)获取元素个数

public int getSize() {return this.size;}

(9)获取元素

根据键(key)获取值(val)

 public V get(K key) {Node<K, V> curNode = this.head.next;while (curNode != null) {if (curNode.key.equals(key)) {return curNode.val;}curNode = curNode.next;}return null;}

(10)删除元素

返回boolean值,判断是否删除成功

public boolean remove(K key) {Node<K, V> pre = this.head;while (pre.next != null) {Node<K, V> delNode = pre.next;if (delNode.key.equals(key)) {pre.next = pre.next.next;delNode.next = null;this.size--;return true;}pre = pre.next;}return false;}

3.方法调用

        继承SelfMap的接口,将其中的方法全部重写,然后进行调用,调取自己已经写好的代码,以此来实现Map

package com.algo.lesson.lesson05.map;public class LinkedMap<K, V> implements SelfMap<K, V> {private LinkedData<K, V> data;public LinkedMap(){this.data=new LinkedData<>();}@Overridepublic boolean isEmpty() {return this.data.isEmpty();}@Overridepublic int getSize() {return this.data.getSize();}@Overridepublic boolean containsKey(K key) {return this.data.contain(key);}@Overridepublic V fetValueByKey(K key) {return this.data.get(key);}@Overridepublic void put(K key, V val) {this.data.addHead(key,val);}@Overridepublic boolean removeByKey(K key) {return this.data.remove(key);}@Overridepublic void set(K key, V val) {boolean ret= this.data.set(key,val);System.out.println(ret?"successful":"failed");}@Overridepublic void show() {System.out.println(this.data);}
}

 三、对应题目

350. 两个数组的交集 II力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目利用映射(哈希表)来解决,感兴趣可以去LeetCode上尝试一下

class Solution {public int[] intersect(int[] nums1, int[] nums2) {if(nums1.length>nums2.length){return intersect(nums2,nums1);}Map<Integer,Integer>map=new HashMap<Integer,Integer>();for(int num:nums1){int count=map.getOrDefault(num,0)+1;map.put(num,count);}int[]intersection=new int[nums1.length];int index=0;for(int num:nums2){int count=map.getOrDefault(num,0);if(count>0){intersection[index++]=num;count--;if(count>0){map.put(num,count);}else{map.remove(num);}}}return Arrays.copyOfRange(intersection,0,index);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

102.乐理基础-五线谱-高音谱号

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的构造、谱号是什么-CSDN博客 谱号一共需要学习和了解四种&#xff0c;如下图&#xff1a;要牢牢掌握的是高音谱号和低音谱号这两种&#xff0c;如图1所示 首先高音谱号&#xff1a; 它大致范围&#xff0c;…

Vue3中的ref和shallowRef、reactive和shallowReactive

一&#xff1a;ref、reactive简介 ref和reactive是Vue3中定义响应式数据的一种方式。ref通常用来定义基础类型数据。reactive通常用来定义复杂类型数据。 二、shallowRef、shallowReactive简介 shallowRef和shallowReactive是Vue3中定义浅层次响应式数据的方式 三、Api使用对比…

Mac中java jdk、android sdk、flutter sdk目录

1、Java JDK 目录 &#xff08;1&#xff09;官网下载的 Java JDK Java JDK下载官网 /Library/Java/JavaVirtualMachines&#xff08;2&#xff09;Android Studio下载的 Java JDK /Users/用户名/Library/Java/JavaVirtualMachines2、Android SDK 目录 /Users/用户名/Libr…

ansible处理多台机器部署基础环境

本次以多台机器需部署zabbix客户端为例&#xff1a; 机器先做免密互信&#xff0c;ansible主机上执行ssh-keygen,一路回车&#xff0c;然后将公钥发送给需管理的主机&#xff1a; ssh-copy-id rootIP 1、编辑hosts文件&#xff0c;添加需配置的主机IP&#xff0c;并测试连通…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践

背景&#xff1a;在某个嵌入式上的图像处理项目功能开发告一段落&#xff0c;进入性能优化阶段。尝试从多线程上对图像处理过程进行加速。经过初步调研后&#xff0c;可以从OPENMP&#xff0c;TBB这两块进行加速&#xff0c;当前项目中有些算法已采用多线程加速&#xff0c;这次…

【蓝桥杯冲冲冲】[NOIP2000 提高组] 方格取数

蓝桥杯备赛 | 洛谷做题打卡day19 文章目录 蓝桥杯备赛 | 洛谷做题打卡day19[NOIP2000 提高组] 方格取数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 [NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N…

如何用甘特图跟踪项目进度

甘特图是一个简单但是极其强大的项目管理工具,能够清晰可视化复杂项目的进度,在项目跟踪和控制上发挥重要作用。任何一个严肃的项目组织者都会使用甘特图来规划和管理项目中的任务。 甘特图的纵坐标表示项目的各项活动或任务,横坐标表示项目的时间进度。每个任务用一条横条表示…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

LLM应用开发与落地:基于上下文的文本信息检测与提取

最近一直用LLM解决各种各样的问题&#xff0c;感觉已经脱离不了LLM了。每次使用LLM解决一个之前解决不了的问题&#xff0c;或者大大提升我的工作效率的时候&#xff0c;我内心都小小会激动一下。我想这是只通过看文章或只是研究AI理论感受不到的小确幸。我也因此更加确信LLM是…

Kotlin MultiPlatform:构建跨平台应用的未来

Kotlin MultiPlatform&#xff1a;构建跨平台应用的未来 1 引言 1.1 Kotlin MultiPlatform简介 Kotlin MultiPlatform&#xff08;简称KMP&#xff09;是一种由JetBrains开发的跨平台开发解决方案&#xff0c;它建立在Kotlin语言之上。KMP允许开发者使用一套Kotlin代码来构建…

【2024】Docker部署Redis

1.说明&#xff1a; 因为容器实例的运行是有生命周期的&#xff0c;一些redis的备份、日志和配置文件什么的最好还是放在服务器本地。这样当容器删除时&#xff0c;我们也可以保留备份和日志文件。所以先在本地服务器安装redis并配置文件设置。下面是安装步骤: 2.安装步骤 1…

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

Android源码设计模式解析与实战第2版笔记(二)

第二章 应用最广的模式 — 单例模式 单例模式的定义 确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 单例模式的使用场景 确保某个类有且只有一个对象的场景&#xff0c;避免产生多个对象消耗过多的资源&#xff0c;或者某种类型的对象只应…

压电式、电磁式蜂鸣器设计电路

蜂鸣器常用分类从两方面 声源类型&#xff1a;压电蜂鸣器( Piezoceramic Element Buzzers )、电磁蜂鸣器( Magnetic Buzzers ) 驱动类型&#xff1a;有源蜂鸣器( Indicators )、无源蜂鸣器( Transducers ) 一、电磁式蜂鸣器 无源电磁式设计电路 电磁蜂鸣器的线圈类似于电感&am…

web前端项目-动画特效【附源码】

文章目录 一&#xff1a;赛车游戏动画HTML源码&#xff1a;JS源码&#xff1a;CSS源码&#xff1a;&#xff08;1&#xff09;normalize.css&#xff08;2&#xff09;style.css 二&#xff1a;吉普车动画演示HTML源码&#xff1a;CSS源码&#xff1a;&#xff08;1&#xff09…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 本篇文章是对已有一篇文章的整理归纳&#xff0c;并对文章中…

HybridA* 论文解读

本文旨在对原论文进行翻译&#xff0c;对混合A*有一个大概的理解 论文题目&#xff1a;Practical Search Techniques in Path Planning for Autonomous Driving 1 摘要 本文描述了一个实用的路径规划算法&#xff0c;无人驾驶汽车在未知的环境中&#xff0c;障碍物通过机器人…

计算机毕业设计 | SSM 凌云招聘平台(附源码)

1&#xff0c;绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

day34WEB 攻防-通用漏洞文件上传黑白盒审计逻辑中间件外部引用

目录 一&#xff0c;白盒审计-Finecms-代码常规-处理逻辑 黑盒思路&#xff1a;寻找上传点抓包修改突破获取状态码及地址 审计流程&#xff1a;功能点-代码文件-代码块-抓包调试-验证测试 二&#xff0c;白盒审计-CuppaCms-中间件-.htaccess 三&#xff0c;白盒审计-Metin…

银行数据仓库体系实践(11)--数据仓库开发管理系统及开发流程

数据仓库管理着整个银行或公司的数据&#xff0c;数据结构复杂&#xff0c;数据量庞大&#xff0c;任何一个数据字段的变化或错误都会引起数据错误&#xff0c;影响数据应用&#xff0c;同时业务的发展也带来系统不断升级&#xff0c;数据需求的不断增加&#xff0c;数据仓库需…