数据结构——用链表实现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方法,按照我们希望的格式去输出

@Override
        public 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)打印映射

@Override
    public 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<>();
    }

    @Override
    public boolean isEmpty() {
        return this.data.isEmpty();
    }

    @Override
    public int getSize() {
        return this.data.getSize();
    }

    @Override
    public boolean containsKey(K key) {
        return this.data.contain(key);
    }

    @Override
    public V fetValueByKey(K key) {
        return this.data.get(key);
    }

    @Override
    public void put(K key, V val) {
        this.data.addHead(key,val);
    }

    @Override
    public boolean removeByKey(K key) {
        return this.data.remove(key);
    }

    @Override
    public void set(K key, V val) {
        boolean ret= this.data.set(key,val);
        System.out.println(ret?"successful":"failed");
    }

    @Override
    public 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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springfox Swagger3从入门案例

首先&#xff0c;在pom.xml中添加依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io…

【从零到一】跑通CATR(一):并行超算云的环境配置

从零到一配环境篇 由于今年要展开大量的编程工作&#xff0c;实验室在用的云计算平台是并行超算云&#xff0c;因此打算在寒假期间先熟悉一下超算云的环境&#xff0c;并从配套的文档和网上的教程开始&#xff0c;从零到一先跑通一个用于音视频分割的模型CATR。 以blog的形式…

vue项目打包部署到服务器并使用cdn加速

配置 vue.config.js文件 const isProd process.env.NODE_ENV production module.exports {// 其他配置chainWebpack: config > {// 生产环境下使用CDNif (isProd) {config.plugin(html).tap(args > {args[0].cdn assetsCDNreturn args})}},// 生产环境下替换路径为c…

深度学习分类问题之Logistic Regression

逻辑回归模型&#xff0c;虽然名字是回归&#xff0c;但是是解决分类问题。 在线性回归里面&#xff0c;我们根据有效信息&#xff0c;预测下一个由已知信息得到的数值&#xff0c;叫做回归问题&#xff0c;但是在机器学习里面&#xff0c;常见的是分类问题。最常见的就是MNIS…

【深度学习】sdxl中的 tokenizer tokenizer_2 区别

代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个分词器 tokenizer 和 tokenizer_2&#xff1f; 在仔细阅读这些代码后&#xff0c;我们了解到 tokenizer_2 主要是用于 refiner 模型的。 #…

【Flink】记录Flink 任务单独设置配置文件而不使用集群默认配置的一次实践

前言 我们的大数据环境是 CDP 环境。该环境已经默认添加了Flink on Yarn 的客户端配置。 我们的 Flink 任务类型是 Flink on Yarn 的任务。 默认的配置文件是在 /etc/flink/conf 目录下。如今我们的需求是个别任务提供的配置仅用于配置执行参数&#xff0c;例如影响作业的配置…

HCIA学习第四天:静态路由与动态路由

静态路由&#xff1a; 选路原则&#xff1a;尽量选择路径最短的路由条目 扩展配置&#xff1a; 1、负载均衡&#xff1a;当路由器访问同一个目标且目标且目标具有多条开销相似的路径时&#xff0c;可以让设备将流量拆分后延多条路径同时进行传输&#xff0c;以达到叠加带宽的…

JavaScript 学习笔记(JS进阶 Day2)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

PCL-IO输入输入模块

IO输入输入模块 一、概述二、点云数据格式1. PCD 格式2. PLY 格式3. OBJ 格式4. STL 格式5. OFF 格式 三、读取3D文件1. API 总览2. 示例 四、保存3D文件1. API 总览2. 示例 一、概述 PCL 库提供了一个模块用来对3D数据进行读写操作&#xff0c;这个库提供了一个模块&#xff…

CPQ配置报价 | 面向非标设备制造项目报价系统解决方案

在非标设备细分领域&#xff0c;企业面向定制型项目经常会遇到以下难题&#xff1a;第一&#xff0c;方案制作效率低&#xff0c;易出错&#xff1b;第二&#xff0c;成本核算过程不严谨&#xff0c;准备性差&#xff1b;第三&#xff0c;报价试算过程不科学&#xff1b;第四&a…

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

C++知识点笔记

二维数组 定义方式&#xff1a; 1、数据类型 数组名[行数][列数]; 2、数据类型 数组名[行数][列数]{{数据1,数据2},{数据3,数据4}}; 3、数据类型 数组名[行数][列数]{数据1,数据2,数据3,数据4}; 4、数据类型 数组名[][列数]{数据1,数据2,数据3,数据4}; 建议&#xff1a;以…

ERROR Failed to get response from https://registry.npm.taobao.org/ 错误的解决

这个问题最近才出现的。可能跟淘宝镜像的证书到期有关。 解决方式一&#xff1a;更新淘宝镜像&#xff08;本人测试无效&#xff0c;但建议尝试&#xff09; 虽然无效&#xff0c;但感觉是有很大关系的。还是设置一下比较好。 淘宝镜像的地址&#xff08;registry.npm.taobao…

leetcode hot 100 电话号码的字母组合

在本题目中&#xff0c;要求我们根据给的数字字符串对应电话号码上的字母组合。所以我们需要建立起数字和电话上字母的对应关系。 然后&#xff0c;组合问题依旧采用回溯来做。首先我们需要确定一下参数&#xff0c;我们需要给的digits&#xff0c;然后还需要字母和数字对应关…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

HTML - 介绍

一.简介 HTML&#xff0c;超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;是一种用于创建网页的标准标记语言。我们可以使用HTML建立自己的WEB网站或特定页面。HTML运行在浏览器上&#xff0c;由浏览器解析。 ⚠️注意&#xff1a;HTML文件的后缀…

HTML以及CSS相关知识总结(二)

css文件写样式时建议遵循以下顺序&#xff1a; 1.布局定位属性:display/position/float/ear/visibility/overflow(建议display第一个写&#xff0c;毕竟关系到模式) 2.自身属性: width/height/margin/ padding /border/ background 3.文本属性: color/font / text-decoration/t…

区块链中分叉机制

在区块链中我们经常会听到分叉【fork】的概念&#xff0c;今天通过这篇文章来详细的介绍下分叉 什么是分叉 在介绍区块链的分叉机制中&#xff0c;我们以公有链来说明&#xff0c;公有链是去中心化的。任何协议的改变都是代价巨大的&#xff0c;因为全网那么多节点&#xff0…

国产GC6610应用于打印机,医疗器械等产品中,可替代TMC2208/2209/trinamic的参数分析

电机驱动芯片应用范围十分广泛&#xff0c;目前已经广泛应用于消费电子、电动工具、打印机、3D打印、安防监控、通信设备、汽车&#xff0c;以及工业控制等领域。据市场调研机构ResearchAndMarkets统计&#xff0c;2021年全球电机驱动芯片是市场规模为38.8亿美元&#xff0c;预…

uniapp小程序:内存超过2mb解决方法(简单)message:Error: 上传失败:网络请求错误 代码包大小超过限制。

分析&#xff1a;这种情况是代码文件内存超过2mb无法进行预览上传 解决方法&#xff1a; 1、Hbuilder中点击运行-->运行到小程序模拟器--->运行时是否压缩代码 2、在微信小程序中点击详情--->本地设置&#xff1a; 3、点击预览即可运行了