Java集合(四)--treeset/treemap/章节练习题目/去重原理的解读和应用

news/2024/10/20 18:42:17/

文章目录

  • 1.treeset结构
  • 2.treemap结构
  • 3.集合去重辨析总结
  • 4.对于arraylist的练习题目
  • 5.对于HashMap的练习题目
  • 6.第三点的去重运用
  • 7.HashSe练习题目

treeset_1">1.treeset结构

下面的这个就是对于这个treeset结构进行测试的一个程序,在这个里面,add表示的就是对于这个树上面进行元素的添加,打印的结果也是无序的;

image-20241019120036668

我们之前进行这个集合选型介绍的时候,说过这个tree结构可以对于这个数据进行排序操作,这个想要实现排序的效果,需要我们自己手动传递进去一个比较器,我们上面的这个就是传递的一个匿名内部类,在这个匿名内部类里面,我们对于这个比较的规则进行了说明,上面的这个是return两个转换为这个string之后的长度相减,因此这个输出的结果就是按照长度进行排序的;

如果我们写成这个return (string) o1.compareTo((string) o2)这也写的话,就是按照这个字典序进行比较的,输出的结果也是我们的字母序的方式;

treemap_11">2.treemap结构

treemap是一个k-v的形式,我们想要实现这个排序的效果,也是需要对于这个里面的new对象的时候添加比较器的,我们下面的这个就是根据这个字典序进行比较,我们也可以根据上面的这个字符串的长度进行比较,也是可以的,只需要在这个对应的内部类里面进行修改就可以了;

image-20241019120844657

下面的这个就是我们的源码里面具体是插入数据的过程:为什么这个不可以插入相同数据,主要就是我们的这个cmp是这个比较的返回值,当插入的这个key和这个已有的key一样的时候,就会cmp返回0,这样进行下面的这个分支判断的时候,就会进入这个else里面去,进而直接返回,这个就是插入相同内容不会打印的原因;

/** if (cpr != null) {*             do {//下面的这个就是不断地进行遍历*                 parent = t;*                 //这个地方主要就是根据这个compare方法决定的*                 //进行下面的这个比较,==0的时候就会直接进入else,直接return操作*                 //主要是我们的main方法里面的这个compare方法是如何实现的*                 cmp = cpr.compare(key, t.key);*                 //下面的这个就是不断的寻找位置的过程*                 if (cmp < 0)*                     t = t.left;*                 else if (cmp > 0)*                     t = t.right;*                 else {*                     V oldValue = t.value;*                     if (replaceOld || oldValue == null) {*                         t.value = value;*                     }*                     return oldValue;*                 }*             } while (t != null);* 上面第一次添加传进去的是两个一样的key,但是这个返回值不会被我们接受,* 这个主要是为了判断我们的这个数组是不是空的,如果是空的,这个compare方法* 里面就会抛异常*/

3.集合去重辨析总结

1.hashsettreeset是如何实现去重的?

hashset:使用的就是我们的hashcode()方法和这个equals()方法,首先使用这个hashcode()方法计算这个数据在数组里面插入到的位置的索引,也就是数组的下标,然后使用这个equals()方法,但是前提是这个位置有数据,如果这个数组对应的下标没有数据,这个时候就可以直接插入数据,但是如果有数据,我们需要使用这个equals方法判断我们插入的数据和已有的数据内容(或者是属性,这个比较是程序员进行重写的,不是固定的)是不是一样的,如果不是一样的就可以进行挂载(链表需要对于这个链表进行遍历–也就是一个一个的进行比较),否则无法进行插入(这个就是去重);

treeset:如果我们传递这个compaartor匿名对象(这篇文章的第二点就是这个场景的),就是用实现的这个compare方法进行去重(我们自己设计,根据内容或者是长度,或者是其他的),使用的这个compare方法如果返回的是0,说明是相同的元素(或者是数据),这个时候就不会被添加,

如果没有传递comparator对象,则以我们添加对象实现的comparable接口的compareTo方法(string.java文件)进行去重;字符串的compareTo方法就是比较的内容;

string实现comparable接口;

4.对于arraylist的练习题目

image-20241020102047243

java">import java.util.ArrayList;
//这个主要是为了一直报警信息~~
@SuppressWarnings({"all"})
public class test {public static void main(String[] args) {//new出来一个arraylisy列表ArrayList arrayList = new ArrayList();//向这个列表里面添加内容,每一个内容都是一个新闻arrayList.add(new News("第一个新闻的主要的内容就是今天的天气很好,主要的内容就是今天的天气很好"));arrayList.add(new News("第二个新闻的主要的内容就是今天的天气很不不不不好,主要的内容就是今天的天气很好不"));//对于这个新闻内容进行遍历,使用这个size方法对于这个过程进行控制int size=arrayList.size();for(int i=size-1;i>=0;i--){//System.out.println(arrayList.get(i));//下面的这个是先得到我们的这个新闻对象,然后进行类型转换//这个主要是因为我们的这个get得到的列表类型的数据,需要转换为我们的自定义类型的对象News news = (News)arrayList.get(i);//下面的这个就是调用我们的成员方法对于这个新闻标题进行处理System.out.println(processTitle(news.getTitle()));}}//下面的这个就是对于我们的这个新闻的长度进行处理,如果大于15,我们就会调用这个sustring方法对于这个超出的部分使用...进行表示public static String processTitle(String title){if(title==null){return "";}if(title.length()>15){return title.substring(0,15)+".........";}else{return title;}}
}
@SuppressWarnings({"all"})
class News{private String content;private String title;
//根据题目的要求,只写一个参数进行构造public News(String title) {this.title = title;}
//下面的这个JavaBean都是根据我们的程序员变量自动生成的public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}
//根据题目的要求,重写这个里面的toString方法@Overridepublic String toString() {return "News{" +"title='" + title + '\'' +'}';}
}

5.对于HashMap的练习题目

image-20241020103149266

java">package demo1;import java.util.*;@SuppressWarnings({"all"})
public class test {public static void main(String[] args) {//题目说了需要我们使用这个Map类型的对象,但是我的是使用Map类型的map代替了题目里面的这个m对象,就是换了名字Map map = new HashMap();//使用add方法往这个里面去添加元素map.put("jack",650);map.put("tom",1200);map.put("smith",2900);System.out.println("变化前的情况:");System.out.println(map);//我们插入相同的key但是不同的value就可以达到替换的效果System.out.println("替换为2600之后的情况:");map.put("jack",2600);System.out.println(map);Set set = map.keySet();for (Object key : set) {//这个地方需要进行向下转型map.put(key,(Integer)map.get(key)+100);}System.out.println("薪水加上100之后的情况:");System.out.println(map);System.out.println("=====迭代器while循环遍历员工=====");//entryset里面的每一个数据都是这个entry<k,v>这样的Set entryset = map.entrySet();Iterator iterator = entryset.iterator();while (iterator.hasNext()) {Map.Entry entry =  (Map.Entry)iterator.next();System.out.println(entry.getKey()+"-"+entry.getValue());}System.out.println("======工资======");//得到每一组元素里面的value并且打印输出Collection values = map.values();for (Object value : values) {System.out.println(value);}}
}

6.第三点的去重运用

这个下面的案例算是对于上面的这个第三点的一个去重机制的一个运用吧,可能会帮助我们对于这个去重的原理更好的理解,包括这个里面用到的方法;

这个其实是一个题目,让我们进行判断这个代码会不会报错,这个就是创建了一个treeset,然后往这个里面去进行数据的添加,但是这个会报错:

image-20241020114800488

其实这个主要原因就是我们的这个里面没有实现comparable接口:我们可以添加这个string对象进行调试,查看这个报错的位置,就是下面的这个1569行,因为这个需要被转换为comparable接口,进而调用这个里面的compareTo方法进行比较;

image-20241020114923888

我们的string是常用类,默认是实现了这个方法的,因此我们把这个new Person()换成string字符串都不会报错,因为这个string就实现了我们的这个comparable接口,里面也是有这个方法的,但是我们自定义的这个类person没有实现这个接口,也没有这个方法;

我们的修改方法就是在这个Person类里面去实现这个接口重写这个compareTo方法,这样的话因为return 0,因此我们的这个set里面只能添加一个数据(根据这个去重的规则)返回0,说明每一次进行比较的时候都是一样的,肯定就添加不进去了;

image-20241020120227099

7.HashSe练习题目

image-20241020120443263

第一次我们的print:2个对象

第二次我们的print:3个对象

第三次我们的print:4个对象

第一次,第二次添加就是正常的,但是接下来对于这个p1.name进行了修改为CC,但是这个时候删除p1是无法成功的,因为根据我们的这个1011和CC会重新计算这个索引,和原来的位置肯定是不一样的;因此我们无法成功删除;

第二次添加这个这个1001和CC貌似和原来冲了,但是我们的这个索引一定和原来的不一样,因为原来的是根据这个1011和AA计算出来的,只不过后面修改为这个CC了,但是我们的这个是使用1011和CC计算的,索引肯定和他不一样,因此可以插入,这个时候打印就是3个对象;

第三次添加这个1011,和AA和第一次的这个位置一样,但是第一次的这个已经改为这个CC了,因此我们可以添加,挂载在1011,和CC的这个后面,像链表一样串联起来~~
法成功删除;

第二次添加这个这个1001和CC貌似和原来冲了,但是我们的这个索引一定和原来的不一样,因为原来的是根据这个1011和AA计算出来的,只不过后面修改为这个CC了,但是我们的这个是使用1011和CC计算的,索引肯定和他不一样,因此可以插入,这个时候打印就是3个对象;

第三次添加这个1011,和AA和第一次的这个位置一样,但是第一次的这个已经改为这个CC了,因此我们可以添加,挂载在1011,和CC的这个后面,像链表一样串联起来~~


http://www.ppmy.cn/news/1540590.html

相关文章

YOLOv11改进策略【卷积层】| SAConv 可切换的空洞卷积 二次创新C3k2

一、本文介绍 本文记录的是利用SAConv优化YOLOv11的目标检测网络模型。空洞卷积是一种在不增加参数量和计算量的情况下,通过在卷积核元素之间插入空洞来扩大滤波器视野的技术。并且为了使模型能够适应不同尺度的目标,本文利用SAConv将不同空洞率卷积结果进行结合,来获取更全…

小说漫画系统 fileupload.php 任意文件上传漏洞复现

FOFA搜索语句 "/Public/home/mhjs/jquery.js" 漏洞复现 1.向靶场发送如下数据包 POST /Public/webuploader/0.1.5/server/fileupload.php HTTP/2 Host: xxx.xxx.xx.xx Cookie: PHPSESSID54bc7gac1mgk0l3nm8cv6sek07; uloginid677742617 Cache-Control: max-age0…

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

(二十)、从宿主机访问 k8s(minikube) 发布的 redis 服务

文章目录 1、环境准备2、具体操作2.1、启动 minikube (start/stop)2.2、准备 redis-deployment.yaml2.3、执行 redis-deployment.yaml2.3.1、查看 pod 信息和日志 2.4、检查部署和服务状态2.4.1、如果需要删除 3、查看 IP 的几个命令3.1、查看IP的几个命令3.2、解读3.3、宿主机…

河源市社保卡照片要求及手机自拍拿数码相片回执的方法

河源市的居民在申请或更新社保卡时&#xff0c;需要提交一张符合特定要求的照片。如果您需要更新或申请社保卡&#xff0c;本文将为您详细介绍河源市社保卡照片的规格要求&#xff0c;并指导您如何通过手机自拍获取符合标准的社保卡照片及回执。 根据河源市社保局的指南&#x…

写一段代码判断素数的函数,从主函数中输出一个整数,判断它是否为素数。

C语言关于函数的应用:判断它函数是否为素数。 prime就是用来判断素数的调用函数。 从主函数main开始输出&#xff0c;先输入一个整数&#xff0c;再通过调用函数prime 带来的数字去判断它是否为素数&#xff0c;因为是判断是否为素数&#xff0c;所以真就是素数&#xff0c;…

Electron入门笔记

Electron入门笔记 ElectronElectron 是什么Electron流程模型创建第一个Electron项目配置自动重启主进程和渲染进程通信打包应用 Electron Electron 是什么 跨平台的桌面应用开发框架使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium和 Node.js Electro…

就是这个样的粗爆,手搓一个计算器:还款计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"> <label for"loanAmount">贷款金额 (元)&#xff1a;</…