(有关Map集合的基本性质,请观看本人博文—— 《详解 Map集合》

TreeMap:

特点

  • TreeMap 键不允许插入null
  • 键的底层数据结构是红黑树,可保证键的排序唯一性
  • 线程不安全,效率高
  • 排序分为 自然排序比较器排序

那么,现在,本人就来对这两种排序方法进行一下讲解:

首先是自然排序

自然排序:

条件

  1. 表示这个元素的类 必须实现Comparable接口 (否则无法进行自然排序)
  2. 重写Comparable接口 中的compareTo()方法,根据此方法返回的正、负、0来决定元素的排列顺序:

    若返回0:则不再录入新的元素;

    若返回-1:则将新的元素放在正在比较的元素的左边;

    若返回1:则将新的元素放在正在比较的元素的右边
  3. 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的更多相关文章

  1. 详解 Map集合

    (请关注 本人"集合总集篇"博文--<详解 集合框架>) 首先,本人来讲解下 Map集合 的特点: Map集合 的特点: 特点: 通过 键 映射到 值的对象 一个 映射 ...

  2. 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解

    今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...

  3. Java集合详解6:TreeMap和红黑树

    Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储 ...

  4. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  5. Java 集合类详解(含类图)

    0.参考文献 此图中蓝色为抽象类.深红色表示接口(Arrays除外).绿色表示具体容器类 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedLi ...

  6. TreeSet()详解

    TreeSet()详解   1.TreeSet原理:   /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 *  * Integer能排序(有默认顺序), String能排 ...

  7. java集合框架详解

    java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...

  8. java集合详解

    1.java集合框架的层次结构 Collection接口: Set接口: HashSet具体类 LinkedHashSet具体类 TreeSet具体类 List接口:   ArrayList具体类 L ...

  9. Java集合类的详解与应用

    Java集合类的详解与应用 集合简介: 1.定义:可以同时存储不同类型的数据 他的存储空间会随着数据的增大而增大 2.缺点:只能存储引用数据类型 3.优点:更加合理的利用空间,封装了更多的方法,用起来 ...

随机推荐

  1. Linux系统c语言开发环境

    项目 内容 这个作业属于哪个课程 班级地址 这个作业要求在哪里 作业要求地址 学号-姓名 17041506-张政 学习目标 Linux系统下C语言开发环境搭建,学习Linux系统环境C语言开发过程 L ...

  2. 超越Mask-RCNN:谷歌大脑的AI,自己写了个目标检测AI

    这是一只AI生出的小AI. 谷歌大脑的Quoc Le团队,用神经网络架构搜索 (NAS) ,发现了一个目标检测模型.长这样: △ 看不清请把手机横过来 它的准确率和速度都超过了大前辈Mask-RCNN ...

  3. CodeForces - 1244D 树(一条链)的染色

    题意:给一个无向的无环的树,需要用三种颜色将他染色,相邻的三个点不能有重复的颜色.给出每个点染成每种颜色的花费,求最小的染色花费,如果给的图不能按要求染色,输出-1. 思路:只有三种颜色,相邻三个点还 ...

  4. 用libevent写个简单的server/client

    libevent是一个轻量级的事件触发库,可以很好地利用在网络通讯上面,用其进行大量的异步,延时,重发等场景. 下面是一个server的demo #include include void cb_fu ...

  5. Python第十一章-常用的核心模块03-json模块

    python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用. 本章主要介绍 py ...

  6. iOS 页面流畅技巧(2)

    一.屏幕显示图像的原理 首先从过去的 CRT 显示器原理说起.CRT 的电子枪按照上面方式,从上到下一行行扫描,扫描完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次扫描.为了把显示器的显示 ...

  7. D - 渣渣仰慕的爱丽丝 HDU - 6249(背包问题变形)

    爱丽丝喜欢集邮.她现在在邮局买一些新邮票. 世界上有各种各样的邮票;它们的编号是1到N.但是,邮票不是单独出售的;必须成套购买.有M套不同的邮票可供选择; 第i套包括编号从li到ri的邮票 .同一枚邮 ...

  8. B. The Monster and the Squirrel

    B. The Monster and the Squirrel Ari the monster always wakes up very early with the first ray of the ...

  9. 读者来信 | 如何判断HBase Major Compact是否执行完毕?(已解决)

    前言:之前有朋友加好友与我探讨一些问题,我觉得这些问题倒挺有价值的:于是就想在本公众号开设一个问答专栏,方便技术交流与分享,专栏名就定为:<读者来信>.欢迎关注本人微信公众号<HBa ...

  10. 如何使用Rancher在OpenStack上创建K8S集群

    不可否认的是,OpenStack仍然是可行的云操作系统,并且被全世界许多互联服务提供商使用.而Rancher是业界最为广泛使用的Kubernetes管理平台,通过简洁直观的GUI集中管理企业IT中的多 ...