关于TreeMap自定义排序规则的两种方式

 更新时间:2024年08月01日 09:58:58   作者:訾博ZiBo  
这篇文章主要介绍了关于TreeMap自定义排序规则的两种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

TreeMap自定义排序规则的两种方式

1、概述

TreeMap基于二叉树数据结构存储数据,同时实现了SortedMap接口以保障元素顺序存取,默认按照键的升序排序,也可以自定义排序比较器;

TreeMap常用于实现排序的映射列表,在使用TreeMap时其key必须实现Comparable接口采用自定义的比较器,否则会抛出java.lang.ClassCastExption异常;

2、演示:其key实现Comparable接口

代码演示:

package com.zibo.java.february.third;

import java.util.Set;
import java.util.TreeMap;

public class StuTreeMap {
    public static void main(String[] args) {
        TreeMap<Student,String> treeMap = new TreeMap<>();
        treeMap.put(new Student("大哥",24),"大哥");
        treeMap.put(new Student("二哥",23),"二哥");
        treeMap.put(new Student("三哥",22),"三哥");
        treeMap.put(new Student("四哥",21),"四哥");
        Set<Student> studentSet = treeMap.keySet();
        for (Student student : studentSet) {
            System.out.println(student.toString());
        }
    }
}
// 这里就省略getter和setter方法了
class Student implements Comparable<Student>{

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        // 实现Comparable接口在这里也是自定义排序规则
        // 如果什么也不写,直接默认return 0的话,只能存储第一个被put的元素
        // 注意:升序就这么个写法,不要看网上其他的什么相等返回0,相等的话要返回this.age,否则会出问题
        if(age > o.age){
            return 1;
        }else if(age < o.age){
            return -1;
        }
        return this.age;
    }
}

运行结果:

Student{name='四哥', age=21}
Student{name='三哥', age=22}
Student{name='二哥', age=23}
Student{name='大哥', age=24}

3、演示:采用自定义比较器

代码演示:

package com.zibo.java.february.third;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;

public class StuTreeMap2 {
    public static void main(String[] args) {
        TreeMap<Student2,String> treeMap = new TreeMap<>(new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                // 基本和key实现Comparable接口,重写compareTo方法一致
                // 升序排序就是这么写的
                if(o1.getAge() > o2.getAge()){
                    return 1;
                }else if(o1.getAge() < o2.getAge()){
                    return -1;
                }
                // 相等的时候不能返回0
                return o1.getAge();
            }
        });
        treeMap.put(new Student2("大哥",24),"大哥");
        treeMap.put(new Student2("二哥",23),"二哥");
        treeMap.put(new Student2("三哥",22),"三哥");
        treeMap.put(new Student2("四哥",21),"四哥");
        Set<Student2> studentSet = treeMap.keySet();
        for (Student2 student : studentSet) {
            System.out.println(student.toString());
        }
    }
}

class Student2{

    private String name;
    private int age;

    public Student2() {
    }

    public Student2(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 +
                '}';
    }
}

运行结果:

Student{name='四哥', age=21}
Student{name='三哥', age=22}
Student{name='二哥', age=23}
Student{name='大哥', age=24}

总结

两种方式区别不大,一个是key实现Comparable接口,重写compareTo()方法,另一个是在TreeMap的构造函数中创建new Comparator匿名内部类,重写compare 方法;

两者实现的功能都是一样的;注意写法要按照代码演示中写;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • ZooKeeper官方文档之Java客户端开发案例翻译

    ZooKeeper官方文档之Java客户端开发案例翻译

    网上有很多ZooKeeper的java客户端例子,我也看过很多,不过大部分写的都不好,有各种问题。兜兜转转还是觉得官方给的例子最为经典,在学习之余翻译下来,供朋友们参考
    2022-01-01
  • 通过原理解析Spring mvc的内置编码过滤器

    通过原理解析Spring mvc的内置编码过滤器

    这篇文章通过原理主要给大家解析了关于Spring mvc的内置编码过滤器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • java在hashmap初始化时赋初值过程解析

    java在hashmap初始化时赋初值过程解析

    这篇文章主要介绍了java在hashmap初始化时赋初值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java自定义Scanner类似功能类的实例讲解

    java自定义Scanner类似功能类的实例讲解

    这篇文章主要介绍了java自定义Scanner类似功能类的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java中序列化与反序列化的特性解读

    Java中序列化与反序列化的特性解读

    这篇文章主要介绍了Java中序列化与反序列化的特性解读,当我们需要将内存中的对象持久化到磁盘,数据库中时, 当我们需要与浏览器进行交互时,当我们需要实现 RPC 时, 这个时候就需要序列化和反序列化了,需要的朋友可以参考下
    2023-08-08
  • Java中toString函数的使用示例代码

    Java中toString函数的使用示例代码

    toString()函数用于将当前对象以字符串的形式返回,比如我定义了一个User类,创建了一个user对象,然后使用相应命令去打印user对象,本文结合示例代码介绍了toString函数的使用,需要的朋友可以参考下
    2024-02-02
  • 解读classpath读取resources目录下的文件

    解读classpath读取resources目录下的文件

    这篇文章主要介绍了解读classpath读取resources目录下的文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java利用POI读写Excel文件工具类

    Java利用POI读写Excel文件工具类

    这篇文章主要为大家详细介绍了Java利用POI读写Excel文件的工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    当运行一个Spring Boot项目时,如果未设置JVM内存参数,Spring Boot默认会采用JVM自身默认的配置策略,接下来通过本文给大家介绍Docker环境下Spring Boot应用内存飙升分析与解决方法,需要的朋友参考下吧
    2021-08-08
  • 在Mac下IDEA安装并使用protobuf方式(Java)

    在Mac下IDEA安装并使用protobuf方式(Java)

    这篇文章主要介绍了在Mac下IDEA安装并使用protobuf方式(Java),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论