详解 TreeMap

(有关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

posted @ 2020-03-04 22:39  在下右转,有何贵干  阅读(440)  评论(0编辑  收藏  举报