详解 TreeMap
(有关Map集合的基本性质,请观看本人博文—— 《详解 Map集合》)
TreeMap:
特点:
- TreeMap 键不允许插入null
- 键的底层数据结构是红黑树,可保证键的排序和唯一性
- 线程不安全,效率高
- 排序分为 自然排序 和 比较器排序
那么,现在,本人就来对这两种排序方法进行一下讲解:
首先是自然排序:
自然排序:
条件:
- 表示这个元素的类 必须实现Comparable接口 (否则无法进行自然排序)
- 重写Comparable接口 中的compareTo()方法,根据此方法返回的正、负、0来决定元素的排列顺序:
若返回0:则不再录入新的元素;
若返回-1:则将新的元素放在正在比较的元素的左边;
若返回1:则将新的元素放在正在比较的元素的右边- TreeMap对象采用空参构造
那么,现在本人来通过一个例子来展示下这个类的使用和性质:
首先本人来给出一个实现了Comparable接口、并重写了compareTo()方法的People类:
package about_hashtable;
public class People implements Comparable<People>{
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(People people) {
//假设根据人的年龄大小来排序
int num = this.age - people.age;
//但是年龄一样并不严谨,我们还要根据姓名来比较
int num2 = num==0 ? this.name.compareTo(people.name) : num;
return num2;
}
}
现在,本人来给出一个测试类:
package about_hashtable;
import java.util.TreeMap;
public class Test {
public static void main(String[] args) {
TreeMap<People, String> TreeMap = new TreeMap<>();
TreeMap.put(new People("假奶量", 22),"第一个录入的");
TreeMap.put(new People("锅负乘", 10), "第二个录入的");
TreeMap.put(new People("防阻鸣",56), "第三个录入的");
TreeMap.put(new People("乌咽俎", 0), null);
System.out.println(TreeMap.values());
}
}
现在,本人来展示下运行结果:
可以看到,输出结果已经按照我们设置的比较器排好了顺序
那么,接下来,本人来展示下 使用比较器排序:
使用比较器排序:
条件:
- 采用有参构造,且在创建TreeSet对象时,需要通过参数传入一个Comparetor 比较器
现在,本人来展示下如何 使用比较器排序:
第一种手段——构造一个比较器类:
首先是存储元素信息的类:
package about_hashtable;
public class People {
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
那么,现在本人来给出一个"按照元素姓名长度进行比较"比较器:
package about_hashtable;
import java.util.Comparator;
public class TestComparator implements Comparator<People>{
public TestComparator() {
}
@Override
public int compare(People people1, People people2) {
//按照年龄大小排序
int num = people1.getAge() - people2.getAge();
int num2=num==0?people1.getName().compareTo(people2.getName()):num;
return num2;
}
}
现在,本人来给出一个测试类:
package about_hashtable;
import java.util.TreeMap;
public class Test {
public static void main(String[] args) {
TreeMap<People, String> TreeMap = new TreeMap<>(new TestComparator());
TreeMap.put(new People("锅负乘", 10), "第一个录入的");
TreeMap.put(new People("假奶量", 22),"第二个录入的");
TreeMap.put(new People("防阻鸣",56), "第三个录入的");
TreeMap.put(new People("乌咽俎", 0), null);
for (People people : TreeMap.keySet()) {
System.out.println(people);
}
}
}
那么,让我们来看一下运行结果:
第二种手段——通过 匿名内部类 传递:
People类不做改变,本人仅改变测试类:
package about_hashtable;
import java.util.Comparator;
import java.util.TreeMap;
public class Test {
public static void main(String[] args) {
TreeMap<People, String> TreeMap = new TreeMap<>(new Comparator<People>() {
@Override
public int compare(People people1, People people2) {
//按照年龄大小排序
int num = people1.getAge() - people2.getAge();
int num2=num==0?people1.getName().compareTo(people2.getName()):num;
return num2;
}
});
TreeMap.put(new People("锅负乘", 10), "第一个录入的");
TreeMap.put(new People("假奶量", 22),"第二个录入的");
TreeMap.put(new People("防阻鸣",56), "第三个录入的");
TreeMap.put(new People("乌咽俎", 0), null);
for (People people : TreeMap.keySet()) {
System.out.println(people);
}
}
}
让我们来看一下运行结果:
在这里,本人来对这两种 比较器排序 的应用场景来做一下说明:
一般地:
若是 只用一次该比较器,则使用匿名内部类传递
若是 反复多次使用该比较器,则通过一个比较器类传递
那么,有关TreeMap的基本知识点也就这些了。
(有关Map集合的基本性质,请观看本人博文—— 《详解 Map集合》)
(本人 集合框架 的总集篇博文链接:https://www.cnblogs.com/codderYouzg/p/12416560.html)
详解 TreeMap的更多相关文章
- 详解 Map集合
(请关注 本人"集合总集篇"博文--<详解 集合框架>) 首先,本人来讲解下 Map集合 的特点: Map集合 的特点: 特点: 通过 键 映射到 值的对象 一个 映射 ...
- 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解
今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...
- Java集合详解6:TreeMap和红黑树
Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储 ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- Java 集合类详解(含类图)
0.参考文献 此图中蓝色为抽象类.深红色表示接口(Arrays除外).绿色表示具体容器类 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedLi ...
- TreeSet()详解
TreeSet()详解 1.TreeSet原理: /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 * * Integer能排序(有默认顺序), String能排 ...
- java集合框架详解
java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...
- java集合详解
1.java集合框架的层次结构 Collection接口: Set接口: HashSet具体类 LinkedHashSet具体类 TreeSet具体类 List接口: ArrayList具体类 L ...
- Java集合类的详解与应用
Java集合类的详解与应用 集合简介: 1.定义:可以同时存储不同类型的数据 他的存储空间会随着数据的增大而增大 2.缺点:只能存储引用数据类型 3.优点:更加合理的利用空间,封装了更多的方法,用起来 ...
随机推荐
- OpenCV-Python 图像的几何变换 | 十四
目标 学习将不同的几何变换应用到图像上,如平移.旋转.仿射变换等. 你会看到这些函数: cv.getPerspectiveTransform 变换 OpenCV提供了两个转换函数cv.warpAffi ...
- 干货 | 近期热点机器学习git项目
No1:PyTorchImplementation of DeepMind's BigGAN(https://github.com/huggingface/pytorch-pretrained-Big ...
- Qt 事件使用示例 (一)
Qt 事件使用示例,以一个常见的使用来说明:QLabel 当鼠标滑过时改变颜色. 事先说明要想实现这一功能有很多种方法,如Qss实现,本文使用Qt事件的方式来实现. 第一步,我们得实现一个从QLabe ...
- Centos7 搭建FTP服务
安装vsftpd yum install -y vsftpd 修改配置文件 cd /etc/vsftpd user_list # 白名单 ftpusers # 黑名单 vsftpd.conf # 配置 ...
- E1. String Coloring (easy version)(贪心)
E1. String Coloring (easy version) time limit per test 1 second memory limit per test 256 megabytes ...
- 老技术新谈,Java应用监控利器JMX(1)
先聊聊最近比较流行的梗,来一次灵魂八问. 配钥匙师傅: 你配吗? 食堂阿姨: 你要饭吗? 算命先生: 你算什么东西? 快递小哥: 你是什么东西? 上海垃圾分拣阿姨: 你是什么垃圾? 滴滴司机: 你搞清 ...
- SpringBoot系列之学习教程汇总
对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 一.配置篇 SpringBoot系列之@PropertySource读取yaml文件 >> source down ...
- Git-flow 使用笔记
git-flow 原理:A successful Git branching model,两篇不错的中文翻译: Git开发管理之道,一个成功的Git分支模型. 简单来说,git-flow 就是在 gi ...
- 【linux】阿里云防火墙相关
1. 需现在阿里云安全组策略中开启相应端口,80.3306等. 2. 想用外网访问3306需开启权限,进入mysql键入 GRANT ALL PRIVILEGES ON *.* TO 'myuser' ...
- BadMethodCallException : Call to undefined method App\Models\Article::setContainer()
如果你执行 php artisan db:seed 发生如下错误 说是模型中不存在 静态方法 setContainer()方法,那么你应该检查下你的DatabaseSeeder.php 文件 中的 r ...