LinkedHashMap和TreeMap的基本使用

一.LinkedHashMap集合:(是HashMap集合的儿子,Map集合的孙子)

1.特点:

2.代码实现:

1)键的唯一性:
package com.itheima.a01myMap;
​
import java.util.LinkedHashMap;
​
public class A07_LinkedHashMapDemo3 {public static void main(String[] args) {//1.创建集合LinkedHashMap<String,Integer> lhm=new LinkedHashMap<>();
​//2.添加元素lhm.put("a",123);lhm.put("a",123);lhm.put("b",456);lhm.put("c",789);
​//3.打印集合System.out.println(lhm);/* 运行结果为{a=123, b=456, c=789}添加了两个"a",123 ,但集合中只有一个"a",123 ,因为键是唯一的,不能重复,但值可以重复(和Map集合一样)*/}
}
​
2)键相同时,值不同->添加时以后来添加的为准:(添加元素的put方法有两个功能:添加,覆盖)
package com.itheima.a01myMap;
​
import java.util.LinkedHashMap;
​
public class A07_LinkedHashMapDemo3 {public static void main(String[] args) {//1.创建集合LinkedHashMap<String,Integer> lhm=new LinkedHashMap<>();
​//2.添加元素lhm.put("a",123);lhm.put("a",111);lhm.put("b",456);lhm.put("c",789);
​//3.打印集合System.out.println(lhm);/* 运行结果为{a=111, b=456, c=789}*/}
}
​

二.TreeMap集合:(Map集合的儿子)

1.特点与排序规则:

2.代码实现:(练习)

需求1:

键:整数表示id

值:字符串表示商品名称

要求:按照id的升序排列和按照id的降序排列

  • 按照id的升序排列:id为整型,属于基本数据类型,默认升序排列,所以无需重写比较规则

    package com.itheima.a02myTreeMap;
    ​
    import java.util.TreeMap;
    ​
    public class A01_TreeMapDemo1 {public static void main(String[] args) {//1.创建集合对象TreeMap<Integer,String> tm=new TreeMap<>();
    ​//2.添加元素tm.put(1,"奥利奥");tm.put(5,"可口可乐");tm.put(2,"康师傅");tm.put(4,"雪碧");tm.put(3,"六个核桃");
    ​//3.打印集合System.out.println(tm);//运行结果为{1=奥利奥, 2=康师傅, 3=六个核桃, 4=雪碧, 5=可口可乐}}
    }

    Integer类里比较规则compare方法:

  • 按照id的降序排列:id为整型,属于基本数据类型,默认升序排列,但此时要降序排列,

    因此要重写比较规则-->要用到匿名内部类

    package com.itheima.a02myTreeMap;
    ​
    import java.util.Comparator;
    import java.util.TreeMap;
    ​
    public class A01_TreeMapDemo1 {public static void main(String[] args) {//1.创建集合对象TreeMap<Integer,String> tm=new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {//o1:当前要添加的元素//o2:表示已经在红黑树中存在的元素return o2-o1;/* 返回o1-o2为升序排列返回o2-o1为降序排列如果忘了,返回o1-o2和返回o2-o1挨个试就知道各自的排序规则了*/}});
    ​//2.添加元素tm.put(1,"奥利奥");tm.put(5,"可口可乐");tm.put(2,"康师傅");tm.put(4,"雪碧");tm.put(3,"六个核桃");
    ​//3.打印集合System.out.println(tm);//运行结果为{5=可口可乐, 4=雪碧, 3=六个核桃, 2=康师傅, 1=奥利奥}}
    }
    ​

需求2:

键:学生对象

值:籍贯

要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名同年龄视为同一个人。

  • Student类:

    package com.itheima.a02myTreeMap;
    ​
    public class Student implements Comparable<Student>{private String name;private int age;
    ​
    ​public Student() {}
    ​public Student(String name, int age) {this.name = name;this.age = age;}
    ​/*** 获取* @return name*/public String getName() {return name;}
    ​/*** 设置* @param name*/public void setName(String name) {this.name = name;}
    ​/*** 获取* @return age*/public int getAge() {return age;}
    ​/*** 设置* @param age*/public void setAge(int age) {this.age = age;}
    ​public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
    ​@Overridepublic int compareTo(Student o) {/* this:表示当前要添加的元素形参o:表示已经在红黑树中存在的元素*//*返回值:this的减o的负数:表示当前要添加的元素是小的,存左边正数:表示当前要添加的元素是大的,存右边0:表示当前要添加的元素已经存在,则不存*/int i = this.getAge() - o.getAge();i = i==0?this.getName().compareTo(o.getName()):i;return i;}/* TreeMap集合底层是红黑树,书写比较再排序的规则无需重写hashCode和equals方法*/
    }
    ​

  • 测试类:

    package com.itheima.a02myTreeMap;
    ​
    import java.util.TreeMap;
    ​
    public class A02_TreeMapDemo2 {public static void main(String[] args) {//1.创建集合TreeMap<Student,String> tm=new TreeMap<>();/* TreeMap集合在添加元素时是要对键进行比较再排序的,本例中键属于自定义对象,并没有指定比较再排序的规则,因此要在自定义对象类下指定比较再排序规则*/
    ​//2.创建三个学生对象Student s1=new Student("zhangsan",24);Student s2=new Student("lisi",23);Student s3=new Student("wangwu",24);
    ​//3.添加元素tm.put(s1,"江苏");tm.put(s2,"天津");tm.put(s3,"北京");
    ​//4.打印集合System.out.println(tm);/*运行结果为{Student{name = lisi, age = 23}=天津, Student{name = wangwu, age = 24}=北京,Student{name = zhangsan, age = 24}=江苏}*/}
    }
    ​

    需求3:统计个数

    需求:字符串"aababcabcdabcde"

    请统计字符串中每一个字符出现的次数,并按照以下格式输出

    输出结果:

    a(5)b(4)c(3)d(2)e(1)

分析:本题有关统计:

1) 计数器思想-->不适用,因为计数器思想对于统计的数量比较多或者统计的数量未知是难以实现的

2)利用Map集合进行统计-->适用,HashMap集合和TreeMap集合,其中键表示要统计的内容,值表示次数

注:如果题目中没有要求对结果进行排序,默认使用HashMap集合,

如果题目中要求对结果进行排序,则使用TreeMap集合

本题结果是升序的(字母ASCII码升高的顺序)-->使用TreeMap集合

(用集合的小习惯:用到了再创建,用不到则不创建)

错解:
package a36practice;
​
import java.util.Set;
import java.util.TreeMap;
import java.util.function.BiConsumer;
​
public class TreeMapDemo {public static void main(String[] args) {//1.创建集合TreeMap<Character,Integer> tm=new TreeMap<>();
​//2.字符串String str="aababcabcdabcde";
​//3.调用method方法method(str,tm);
​//4.遍历集合tm.forEach(new BiConsumer<Character, Integer>() {@Overridepublic void accept(Character key, Integer value) {System.out.println(key+"("+value+")");}});}
​//定义方法//需要字符,集合//返回集合private static TreeMap<Character,Integer> method(String str,TreeMap<Character,Integer> tm){//1.遍历集合的键看是否有字符cSet<Character> keys = tm.keySet();for (Character key : keys) {//2.遍历字符串,依次判断哪一个字符与外循环(遍历集合)的键匹配/* 一个键上就要把字符串的某一个字符全部统计完因此键在外循环,字符为内循环*/for (int i = 0; i < str.length(); i++) {//3 获取指定索引上的字符Character c=str.charAt(i);//4.键为key,进行判断if (tm.containsKey(c)) { //判断条件不是key==c,而是tm.containsKey(c)-->键上是否有c//代表已有,键不动,值加1即可Integer value = tm.get(key);value++;//集合添加-->别忘了这步tm.put(c, value);} else {//代表键不存在,给键赋c,值为1-->因为第一次出现tm.put(c, 1);/*key=c;Integer value = tm.get(key);value++; 这么写不对,value++就不对*/}}}return tm;}
}
​

错误原因:方法method里Set<Character> keys = tm.keySet();就有问题,因为第一次执行时集合tm长度为0,键为空,因此Set<Character>就为空,导致for (Character key : keys)循环不了。


正解:遍历方式有三种

第一种:利用StringBuilder类里的append方法实现拼接

package com.itheima.a02myTreeMap;
​
import java.util.TreeMap;
import java.util.function.BiConsumer;
​
public class A03_TreeMapDemo3 {public static void main(String[] args) {//1.定义字符串String s="aababcabcdabcde";
​//2.创建集合TreeMap<Character,Integer> tm=new TreeMap<>();
​//3.遍历字符串得到里面的每一个字符for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);/* 拿着c(c代表字符串里的某个字符)到集合中判断是否存在存在,表示当前字符又出现了一次不存在,表示当前字符是第一次出现*/if(tm.containsKey(c)){//存在//先把存在的这个字符已经出现的次数拿出来Integer count = tm.get(c);//这个代表把次数拿出来再赋值给count,第二次循环不会清除之前的数,更不会弄为0//当前字符又出现了一次,则自增count++;//把自增之后的结果再添加到集合当中tm.put(c,count);}else {//不存在/* 给键赋值。值为1,因为第一次出现再添加到集合中*/tm.put(c,1);}}
​/* //4.打印集合System.out.println(tm);//运行结果为{a=5, b=4, c=3, d=2, e=1}上述打印方式不符合题目要求-->可通过遍历解决*/
​//4.遍历集合,并按照指定的格式拼接即 a(5)b(4)c(3)d(2)e(1)StringBuilder sb=new StringBuilder();
​tm.forEach(new BiConsumer<Character, Integer>() {@Overridepublic void accept(Character key, Integer value) {sb.append(key).append("(").append(value).append(")");}});
​System.out.println(sb);}
}

第二种:利用StringJoiner类里的add方法实现拼接

package com.itheima.a02myTreeMap;import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;public class A03_TreeMapDemo3 {public static void main(String[] args) {//1.定义字符串String s="aababcabcdabcde";//2.创建集合TreeMap<Character,Integer> tm=new TreeMap<>();//3.遍历字符串得到里面的每一个字符for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);/* 拿着c(c代表字符串里的某个字符)到集合中判断是否存在存在,表示当前字符又出现了一次不存在,表示当前字符是第一次出现*/if(tm.containsKey(c)){//存在//先把存在的这个字符已经出现的次数拿出来Integer count = tm.get(c);//这个代表把次数拿出来再赋值给count,第二次循环不会清除之前的数,更不会弄为0//当前字符又出现了一次,则自增count++;//把自增之后的结果再添加到集合当中tm.put(c,count);}else {//不存在/* 给键赋值。值为1,因为第一次出现再添加到集合中*/tm.put(c,1);}}/* //4.打印集合System.out.println(tm);//运行结果为{a=5, b=4, c=3, d=2, e=1}上述打印方式不符合题目要求-->可通过遍历解决*///4.遍历集合,并按照指定的格式拼接即 a(5)b(4)c(3)d(2)e(1)StringJoiner sj=new StringJoiner("","","");/*创建StringJoiner对象时形参要指定开始标记,结束标记和间隔符号本例中开始标记,结束标记和间隔符号全用长度为0的字符串*/tm.forEach(new BiConsumer<Character, Integer>() {@Overridepublic void accept(Character key, Integer value) {sj.add(key+"").add("(").add(value+"").add(")");/* StringJoiner类里的add方法的参数必须是字符串,若不是字符串,则在后面加双引号即""即可*/}});System.out.println(sj);}
}

第三种:直接遍历输出

package com.itheima.a02myTreeMap;import java.util.TreeMap;public class A03_TreeMapDemo3 {public static void main(String[] args) {//1.定义字符串String s="aababcabcdabcde";//2.创建集合TreeMap<Character,Integer> tm=new TreeMap<>();//3.遍历字符串得到里面的每一个字符for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);/* 拿着c(c代表字符串里的某个字符)到集合中判断是否存在存在,表示当前字符又出现了一次不存在,表示当前字符是第一次出现*/if(tm.containsKey(c)){//存在//先把存在的这个字符已经出现的次数拿出来Integer count = tm.get(c);//这个代表把次数拿出来再赋值给count,第二次循环不会清除之前的数,更不会弄为0//当前字符又出现了一次,则自增count++;//把自增之后的结果再添加到集合当中tm.put(c,count);}else {//不存在/* 给键赋值。值为1,因为第一次出现再添加到集合中*/tm.put(c,1);}}/* //4.打印集合System.out.println(tm);//运行结果为{a=5, b=4, c=3, d=2, e=1}上述打印方式不符合题目要求-->可通过遍历解决*///4.遍历集合,并按照指定的格式拼接即 a(5)b(4)c(3)d(2)e(1)tm.forEach((key,value) -> System.out.print(key+"("+value+")"));}
}

三.TreeMap集合总结:


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

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

相关文章

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型&#xff0c;得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能&#xff0c; 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

48.x86游戏实战-封包抓取进图call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

递归神经网络 (RNN) 简介

文章目录 一、介绍二、什么是递归神经网络 &#xff08;RNN&#xff09;&#xff1f;三、展开递归神经网络四、训练递归神经网络五、RNN 的类型六、现实生活中的 RNN 用例七、RNN 的两个主要限制八、RNN的变体8.1 双向递归神经网络 &#xff08;BRNN&#xff09;8.2 长短期记忆…

YOLOv8改进 | 融合改进 | C2f融合Faster-GELU模块提升检测速度【完整代码 + 主要代码解析】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

基于信号量和环形队列的生产者消费者模型

文章目录 POSIX信号量信号量接口初始化信号量销毁信号量等待信号量发布信号量 基于环形队列的生产者消费者模型单生产单消费多生产多消费 POSIX信号量 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的。 但POSIX可以…

接口返回结果封装

接口返回结果封装 1、错误信息枚举 package com.zhw.enums;public enum AppHttpCodeEnum {// 成功SUCCESS(200,"操作成功"),// 登录NEED_LOGIN(401,"需要登录后操作"),NO_OPERATOR_AUTH(403,"无权限操作"),SYSTEM_ERROR(500,"出现错误&quo…

K-medoids算法原理及Python实践

一、原理 K-medoids算法是一种聚类算法&#xff0c;它的原理与K-Means算法相似&#xff0c;但关键区别在于它使用数据集中的实际点&#xff08;称为medoids&#xff09;作为簇的中心点&#xff0c;而不是像K-Means那样使用簇内所有点的平均值。以下是K-medoids算法的主要原理&…

Excel 保持原序时计算组内排名

Excel某表格第1列是分组&#xff0c;第2列是日期&#xff0c;未排序。 AB1Agent IDDate of Sale2Agent107-12-20233Agent105-12-20234Agent209-12-20235Agent313-12-20236Agent214-12-20237Agent222-12-20238Agent115-12-20239Agent117-12-202310Agent213-12-202311Agent120-1…

wooyu漏洞库YYDS!!!入门之道:重现乌云漏洞库

目录 wooyun乌云漏洞库搭建 1、搭建资料 文件结构分析&#xff1a; ​编辑2、搭建过程 2.1、搭建wooyun网站 2.2、配置数据库 2.2.1、修改数据库配置文件conn.php 2.2.2、创建wooyun数据库&#xff0c;并解压数据库文件 2.2.3、连接数据库&#xff08;数据库默认连接密…

计算机基础知识总结(八股文--计算机网络、操作系统、数据库、c++、数据结构与算法)

一、操作系统 0.内存管理 01.什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f; 虚拟内存为程序提供比实际物理内存更大的内存空间&#xff0c;同时提高内存管理的灵活性和系统的多任务处理能力。虚拟地址空间就是进程所能看到的内存空间&#xff0c;这段空间是连续…

【案例61】update driver error

问题现象 顾问在保存数据源时报“update driver error”错误&#xff0c;重启服务器&#xff0c;重启sysConfig.bat后问题依旧。 问题分析 之前碰到这类问题发现是权限的问题。所以先去检查了相关文件夹的权限。 查看控制台发现客户用的是非Administrator用户登录&#xff0…

数学建模2024国赛时间及事项安排

2024年的全国大学生数学建模竞赛即将拉开帷幕。考虑到许多同学可能是首次参与此类赛事&#xff0c;尚不清楚如何进行有效的时间安排&#xff0c;博主在此整理了以往参赛的经验和时间管理策略&#xff0c;希望能为大家提供一些有益的参考&#xff0c;更从容地应对国赛。 本届全国…

网络安全 DVWA通关指南 DVWA File Upload(文件上传)

DVWA File Upload&#xff08;文件上传&#xff09; 文章目录 DVWA File Upload&#xff08;文件上传&#xff09;修复建议 LowMediumHighImpossible 修复建议 1、使用白名单限制可以上传的文件扩展名 2、注意0x00截断攻击&#xff08;PHP更新到最新版本&#xff09; 3、对上传…

出口MID电能表到欧洲市场

出口MID电能表到欧洲市场&#xff01; 浙江永泰隆电子有限公司在研发和将MID能量计出口到欧盟市场方面具有丰富的经验。以下是突显该公司专业性的概述&#xff1a; 公司概况&#xff1a; 浙江永泰隆电子有限公司是一家专注于先进能量测量解决方案的制造商&#xff0c;特别是…

【栈】| 力扣高频题: 有效的括号

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;算法题 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: 力扣20&#xff1a;https://leetcode.cn/problems/valid-parentheses/description/ 本…

linux系统中USB模块基本原理分析

大家好,今天主要给大家分享一下,USB设备的发展历程。 第一:USB发展变化 随着时代的发展,USB模块也随之不断的升级。 USB1.1:规范了USB低全速传输; USB2.0:规范了USB高速传输,采用NRZI(反向不归零)编码(NRZI采用8bit编码方式),位填充(在数据进行NRZI编码前…

虚幻5|制作玩家血量,体力(还未编辑,只用于引用)

未编写&#xff0c;仅引用 优化后&#xff1a; 把增加生命&#xff0c;减少生命&#xff0c;也可以用在体力里&#xff0c;更改如下 限制浮点&#xff0c;如果血量或体力按10来扣&#xff0c;如果你的血量降低到5&#xff0c;那么就会以5的数值来扣&#xff0c;而不会扣成-5…

es 7.17.23安装ik插件启动失败,access denied,Permission

情况简述 windows平台&#xff0c;下载了7.17.23的es以及7.17.23的ik分词器的zip包之后&#xff08; 下载地址&#xff08;官方推荐的&#xff09;&#xff1a;Index of: analysis-ik/stable/ &#xff09;&#xff0c;解压该ik的包到es的plugins下&#xff0c;目录结构&…

Webpack中的 HTTP 压缩

http压缩介绍 http压缩&#xff0c;是指一种内置在服务器和客户端之间改进传输速度和带宽利用率的方式。 http 压缩的流程&#xff1a; http 数据在服务器发送前&#xff0c;通过 webpack配置进行压缩&#xff1b;兼容的浏览器在向服务器发送请求时&#xff0c;在请求头中会…

删除Vue2残留配置文件解决异常:Cannot find module ‘@vue/babel-plugin-transform-vue-jsx‘

背景 完成Vue2代码升级为Vue3后&#xff0c;将新代码上传至代码库。在修改源代码库代码后&#xff0c;启动项目&#xff0c;提示&#xff1a;Cannot find module ‘vue/babel-plugin-transform-vue-jsx‘&#xff0c;尝试安装该第三方库后仍然无效。 解决方案&#xff1a; 删…