当前位置: 首页 > news >正文

JAVA集合专题4 —— Map

目录

      • Map接口实现类的特点
      • Map接口的常见方法
      • Map六大遍历方式
      • Map练习1
        • code
      • 编程练习2
        • code
      • 编程练习3
        • 思路
        • code

Map接口实现类的特点

  • Map与Collection并列存在,是Map集合体系的顶级接口
  • Map的有些子实现存储数据是有序的(LinkedHashMap),有些子实现存储数据是无序的(HashMap)
  • 用于保存具有映射关系的数据:Key-Value。key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value
  • Map中的key和value可以是任何引用类型的数据
  • Map中的key不允许重复,原因和HashSet一样
  • Map中的value可以重复
  • Map的有些子实现允许存储null作为key(比如HashMap),有些子实现不允许存储null作为key(比如TreeMap)
  • Map的key可以为null,value也可以为null,但是key为null只能有一个,value 为null可以多个
  • 常用String类作为Map的key
package cs.kaoyan.javase.com.map;import java.util.HashMap;
import java.util.Map;public class Test1 {public static void main(String[] args) {Map map = new HashMap();map.put("no1","zhang san");map.put("no2","li si");map.put("no1","wang wu");//可以加入,会替换no1的zhang sanmap.put("no3","wang wu");//no.不同,可以加入//{no2=li si, no1=wang wu, no3=wang wu}System.out.println(map);map.put(null,null);//null作为key唯一,所以会替换上面作为value的nullmap.put(null,"abc");//null作为value可以有多个map.put("no4",null);map.put("no5",null);//{no2=li si, null=abc, no1=wang wu, no4=null, no3=wang wu, no5=null}System.out.println(map);//get方法,传入key,会返回对应的value//li siSystem.out.println(map.get("no2"));//wang wuSystem.out.println(map.get("no3"));}
}

Map接口的常见方法

package cs.kaoyan.javase.com.map;import java.util.HashMap;
import java.util.Map;public class Test3 {public static void main(String[] args) {Map map = new HashMap();map.put("zhang san",18);map.put("li si",19);map.put("wang wu",20);map.put("zhao liu",21);map.put("xiao qi",22);map.put("chang feng",23);map.put("tian ming",24);// 7System.out.println(map.size());//remove:根据键删除映射关系map.remove("li si");//get: 根据键获取值//22System.out.println(map.get("xiao qi"));// 6System.out.println(map.size());//FalseSystem.out.println(map.isEmpty());//TrueSystem.out.println(map.containsKey("tian ming"));//清空map.clear();// 0System.out.println(map.size());}
}

Map六大遍历方式

Map不是Iterable的子接口,也就意味着Map没有Iterator方法,所以Map没有办法法"直接"调用foreach循环

  • containsKey:查找键是否存在
  • containsValue:查找值是否存在
  • keySet:获取所有的键(获得map中key的集合视图)
  • values:获取所有的值(获得map中value的集合视图)
  • entrySet:获取所有关系(获得键值对集合)
  • get: 根据键获取值

Map练习1

假设Map中存储了一批<String,User>类型的key-value用户信息,删除User的age是18岁的同学

code

package cs.kaoyan.javase.com.map;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**** 假设Map中存储了一批<String,User>类型的key-value用户信息* 删除User的age是18岁的同学*/public class Test5 {public static void main(String[] args) {Map<String, User> map = new HashMap<>();map.put("zs", new User("zs", 18));map.put("ls", new User("ls", 19));map.put("wu", new User("wu", 20));map.put("zl", new User("zl", 21));map.put("aa", new User("aa", 18));//删除User的age是18岁的同学//不可以一边遍历,一边删除,不然会出现并发修改异常ConcurrentModificationException//先获得key,再通过key获得valueArrayList list = new ArrayList();Set<String> allKey = map.keySet();for (String key : allKey) {//通过key会返回一个user对象User user = map.get(key);if (user.age == 18){//将所有年龄为18的对象的key存入list之中list.add(key);}}//遍历list,删除keyfor (Object o : list) {map.remove(o);}//{zl=User{"zl",21}, ls=User{"ls",19}, wu=User{"wu",20}}System.out.println(map);}
}

编程练习2

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数, 返回它们的索引。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
比如:nums = [2, 7, 11, 15], target = 9.
因为 nums[0] + nums[1] = 2 + 7 = 9. 所以返回 [0, 1].

code

package cs.kaoyan.javase.com.map;import java.util.Arrays;public class Test6 {public static void main(String[] args) {int[] ints = {2,7,11,15};//answer数组用来存储答案int[] answer = {0,0};int target = 9;//方法一:暴力算法,时间复杂度O(n*n)/*for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (ints[i] + ints[j] == target){answer[0] = i;answer[1] = j;}}}System.out.println(answer[0] + " " + answer[1]);*///方法二:二分算法,时间复杂度O(nlogn)//二分需要保证数组有序(数组本身已经有序,可以不写)Arrays.sort(ints);int size = ints.length;for (int i = 0; i < size; i++) {//在长度为size的数组ints中,找到元素target - ints[i]所在的下标int index2 = binarySearch(ints, size, target - ints[i]);if (index2 != -1){//存在两数之和等于targetanswer[0] = i;answer[1] = index2;//假设只有一组答案,满足即可结束循环break;}}System.out.println(answer[0] + " " + answer[1]);}/*** 查找元素x在数组a的下标* @param a:表示数组* @param n:表示数组的长度* @param x:表示要查找的目标元素* @return:x在数组a的下标*/public static int binarySearch(int a[],int n,int x) {int L = 0;int R = n - 1;//ans用来记录查找要查找元素的下标(一般设置为负数)int ans = -1;//二分查找条件:L <= Rwhile (L <= R) {int Mid = (L + R) >> 1;if (a[Mid] == x) {//查找到目标元素ans = Mid;break;}if (a[Mid] < x) {L = Mid + 1;} else {R = Mid - 1;}}//如果返回-1说明未找到要查找的目标元素xreturn ans;}
}

编程练习3

给你一份『词汇表』(字符串数组)words和一张『字母表』(字符串)chars。
假如你可以用chars中的『字母』(字符)拼写出words中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写时,chars中的每个字母都只能用一次。返回词汇表words中你掌握的所有单词的长度之和。
示例 1:
输入:words = [“cat”,“bt”,“hat”,“tree”], chars = “atach”
输出:6
解释:可以形成字符串 “cat” 和 “hat”,所以答案是 3 + 3 = 6。
示例 2:
输入:words = [“hello”,“world”,“leetcode”], chars = “welldonehoneyr”
输出:10
解释:可以形成字符串 “hello” 和 “world”,所以答案是 5 + 5 = 10。

思路

参考博客
遇到字符串仅包含小写(或者大写)英文字母的题,都可以试着考虑构造长度为26的数组。这样数组每个位置分别代表一个字母,统计出字母出现的次数。本题中,既要统计字母表中字母出现的次数,也要统计单词中字母出现的次数。如果字母表中字母出现的次数大于等于单词中每种字母出现的次数,那么这个单词就可以由字母表拼写出来。以字母表 "atach"和 词汇"cat"为例,过程图示如下:
在这里插入图片描述

code

package cs.kaoyan.javase.com.map;public class Test7 {public static void main(String[] args) {String[] words = {"hello","world","leetcode"};String chars = "welldonehoneyr";int sum1 = countAllWordsLength(words, chars);System.out.println(sum1);//10String[] words2 = {"cat","bt","hat","tree"};String chars2 = "atach";int sum2 = countAllWordsLength(words2, chars2);System.out.println(sum2);//6}public static int countAllWordsLength (String[] words,String chars){int result = 0;int[] charsCount = count(chars);//遍历字符串数组for (int i = 0; i < words.length; i++) {int[] wordsCount = count(words[i]);//挨个判断字符串数组中的每一个字符串是否可以由给定的字符组成if (contains(wordsCount,charsCount)){//累计可以被组成的字符串的长度result += words[i].length();}}return result;}/*** 判断给定的字符是否可以组成字符串* @param stringCount:一个数组,存储待判断字符串的字母个数* @param charCount:一个数组,存储给定字符串的字母个数* @return:可以组成返回true,否则返回false*/public static boolean contains(int[] stringCount,int[] charCount){for (int i = 0; i < 26; i++) {//如果待判断的字符串中某个单词出现的次数大于//给定字符串中某个字母出现的次数,表明不能组成这个字符串if (stringCount[i] > charCount[i]){return false;}}return true;}/*** 计算一个单词中26个字母出现的次数* @param s:传入一个单词* @return:一个整型数组*/public static int[] count(String s){//新建一个整型数组,用来存放每个英文字母出现的次数int[] charCountArray = new int[26];//遍历字符串for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);charCountArray[(int)c - 'a'] += 1;}return charCountArray;}
}

相关文章:

JAVA集合专题4 —— Map

目录Map接口实现类的特点Map接口的常见方法Map六大遍历方式Map练习1code编程练习2code编程练习3思路codeMap接口实现类的特点 Map与Collection并列存在&#xff0c;是Map集合体系的顶级接口Map的有些子实现存储数据是有序的(LinkedHashMap)&#xff0c;有些子实现存储数据是无…...

二叉树进阶--二叉搜索树

目录 1.二叉搜索树 1.1 二叉搜索树概念 1.2 二叉搜索树操作 1.3 二叉搜索树的实现 1.4 二叉搜索树的应用 1.5 二叉搜索树的性能分析 2.二叉树进阶经典题&#xff1a; 1.二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;…...

牛客网Python篇数据分析习题(三)

1.现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID Level&#xff1a;等级 Achievement_value&#xff1a;成就值 Num_of_exercise&a…...

Java开发常见关键词集绵

一、关键词1&#xff1a; &#xff08;1&#xff09;RPC&#xff1a;远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式。远程调用的时候让人们觉得是本地调用。 &#xff08;2&#xff09;HTTP&#xff1a;超文本传输协议&#xff08;Hyper Text Transfer…...

解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题

文章目录1. 复现问题2. 分析问题3. 解决问题4. 补充解决java.lang.OutOfMemoryError: PermGen space问题1. 复现问题 今天使用idea开发时&#xff0c;突然报出如下错误&#xff1a; Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat org.…...

为什么子进程要继承处理器亲缘性?

请先考虑一个典型的程序为什么需要启动一个子进程。(当然资源管理器不算一个典型的程序) 这是因为手头的任务被分解为子任务&#xff0c;无论出于何种原因&#xff0c;这些子任务都被放入子流程中。例如&#xff0c;在实现多次遍历型编译器/链接器时&#xff0c;其中每次遍历都…...

【算法】高精度

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;不能只会思路&#xff0c;必须落实到代码上&#x1f43e; 文章目录前言一、高精度加法二、高精度减法三、高精度乘法四、高精度除法前言 ​ 高精度即很大很大的数&#xff0c;超过了 long long 的范围&…...

计算机网络-基本概念

目录 计算机网络-基本概念 互联网 Java的跨平台原理 ​编辑 C\C的跨平台原理 解释性语言的跨平台原理(python,js等) 客户端 vs 服务器 什么是协议&#xff1f; 网络互连模型 请求过程 计算机之间的通信基础 计算机之间的连接方式-网线直连(需要用交叉线&#xff0c;而…...

你评论,我赠书~【哈士奇赠书 - 13期】-〖Python程序设计-编程基础、Web开发及数据分析〗参与评论,即可有机获得

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…...

【设计模式】我终于读懂了代理模式。。。

&#x1f466;代理模式的基本介绍 1)代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2)被代理的对象可以是远程对象、创建…...

每天10个前端小知识 【Day 2】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…...

帮助中心在线制作工具推荐这4款,很不错哟!

根据用户咨询问题是否解决的情景&#xff0c;分为三个部分&#xff0c;首先帮助中心恰好有用户需要咨询的问题&#xff0c;用户可以通过点击相关问题即可解决自己的问题&#xff0c;其次&#xff0c;用户第一眼没有在帮助中心解决问题&#xff0c;有个搜索框&#xff0c;用户的…...

rabbitMQ相关文章汇总

RabbitMQ五种工作模式&#xff1a; https://blog.csdn.net/weixin_41882200/article/details/117128590?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167625223516800182771874%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id1…...

【C++】异常

&#x1f308;欢迎来到C专栏~~异常 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1…...

@Validated注解不生效问题汇总

Validated注解不生效问题汇总 文章目录Validated注解不生效问题汇总背景&#xff1a;一&#xff1a;可能原因原因1&#xff1a;原因2&#xff1a;原因3&#xff1a;原因4&#xff1a;二&#xff1a;补充全局异常对validation的处理背景&#xff1a; 项目框架应用的是validatio…...

华科万维C++章节练习2_4

题目&#xff1a;编写程序&#xff0c;从键盘输入一个字符&#xff0c;然后在屏幕上输出该字符开头的连续3个字符以及对应ASCII码。 输出格式请参看&#xff1a; 请输入一个字符>>A 字符 ASCII码 A 65 B 66 C 67 请按任意键继续. . . 请直接…...

17万字数字化医院信息化建设大数据平台建设方案WORD

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 第1章 医院信息化概述 1.…...

Android 11系统签名修改

Android OS 映像在两个地方使用加密签名&#xff1a;映像中的所有 .apk 文件都必须经过签名。Android 软件包管理器通过下列两种方式使用 .apk 签名&#xff1a;更换应用时&#xff0c;必须使用与旧应用相同的密钥对其签名&#xff0c;才能存取旧应用的数据。无论是通过覆盖 .a…...

亚马逊、沃尔玛卖家自养号退款经验和测评技术

今天给大家介绍下在做亚马逊、沃尔玛退款自养号中的经验&#xff0c;众所周知&#xff0c;自养号最重要的是养号的环境&#xff0c;包括系统的纯净度&#xff0c;下单的信用卡以及其他的一些细节。 环境系统市面上有很多&#xff0c;鱼龙混杂&#xff0c;比如什么lumi&#xf…...

Spring Security in Action 第十一章 SpringSecurity前后端分离实战

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...