当前位置: 代码网 > it编程>编程语言>Java > 关于TreeMap自定义排序规则的两种方式

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

2024年08月01日 Java 我要评论
treemap自定义排序规则的两种方式1、概述treemap基于二叉树数据结构存储数据,同时实现了sortedmap接口以保障元素顺序存取,默认按照键的升序排序,也可以自定义排序比较器;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 方法;

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com