(有关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. [图中找环] Codeforces 659E New Reform

    New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  2. 报错:Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'gender' at row 1

    我遇到这个错误是解决办法:我修改了对应的数据库字段的长度:原本我设置的是char型,但是存进去的是一个string型,结果就报了这个报了这个错误 下面就是数据库修改之后的结果. 以上都是我学习过程中遇 ...

  3. 如何测试Linux命令运行时间?

    良许在工作中,写过一个 Shell 脚本,这个脚本可以从 4 个 NTP 服务器轮流获取时间,然后将最可靠的时间设置为系统时间. 因为我们对于时间的要求比较高,需要在短时间内就获取到正确的时间.所以我 ...

  4. python文件封装成*.exe

    python文件封装成*.exe文件(单文件和多文件) 环境:win10 64位 python3.7 原文: https://www.cnblogs.com/jackzz/p/9431923.html ...

  5. python 开发工具简介

    一.python 开发工具简介 1.IDLE IDLE是开发python程序的基本IDE(集成开发环境),具备基本的IDE的功能,是非商业Python开发的不错的选择.当安装好python以后,IDL ...

  6. RecyclerView实现拖动排序和滑动删除功能

    RecyclerView 的拖动排序需要借助一下 ItemTouchHelper 这个类,ItemTouchHelper 类是 Google 提供的一个支持 RecyclerView 滑动和拖动的一个 ...

  7. linux压缩及归档

    一.解析 压缩:把大文件,通过压缩成一个比之前小的文件. 归档(打包):把多个文件,归档成一个文件. 二.压缩 1.zip(归档压缩,可以压缩目录,要保存源文件) 压缩:zip  压缩后的文件名 压缩 ...

  8. Q - Marriage Match IV (非重复最短路 + Spfa + 网络最大流Isap)

    Q - Marriage Match IV Do not sincere non-interference. Like that show, now starvae also take part in ...

  9. Java并发基础08. 造成HashMap非线程安全的原因

    在前面我的一篇总结(6. 线程范围内共享数据)文章中提到,为了数据能在线程范围内使用,我用了 HashMap 来存储不同线程中的数据,key 为当前线程,value 为当前线程中的数据.我取的时候根据 ...

  10. 深度解析Java中的5个“黑魔法”

    现在的编程语言越来越复杂,尽管有大量的文档和书籍,这些学习资料仍然只能描述编程语言的冰山一角.而这些编程语言中的很多功能,可能被永远隐藏在黑暗角落.本文将为你解释其中5个Java中隐藏的秘密,可以称其 ...