Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 256|回复: 0

[默认分类] java利用自定义类型对树形数据类型进行排序

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2016-1-3 17:54:13 | 显示全部楼层 |阅读模式
    前言
    为什么集合在存自定义类型时需要重写equals和hashCode?
    1、先说List集合
    List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了!
    因为我们通常判断一个对象是否在集合中存在只需要判断值就行   而List内部实现方法是用地址来进行判断的  因为我们在创建对象时即使是值都一样
    但是内存地址不一样 所以也就无法判定 一个对象是否在另一个对象中存在     我们可以在自定义类中重写equals方法 只是值相等就证明该对象在集合中存在
    2、在说Set集合
    Set集合在存自定义类型的数据时 为了要保证唯一性(set集合的特点:数据是不能重复的)我们要重写hashCode(执行效率高) 和 equals  内部就会自动判断
    如果数据相等就不添加否则就添加到集合中
      
    不管是利用Set集合的TreeSet  还是用Map集合的TreeMap  这二个数据类型的共同点都是  只存知道怎么排序的集合这是为什么,如果我们要想存自定义类型的数据该怎么办?
    是因为上面二个集合在add的时候内部调用了基本数据类型的compareTo方法(内部排序是先比较后排序)  这些数据类型(例如String、Double)内部都已经重写了compareTo方法 所以可以自动排序
    而我们在上面二个集合中添加自定义类型的数据时  会报错编译不通过(因为树形数据类型 是不存不知道怎么排序的集合的) 就是因为 自定义类型不知道按什么排序 是添加不到上面集合中去的 这个时候我们也需要重写compareTo  按我们自定义类型中的某个字段排序就可以了。
    重写compareTo是第一种方法 下面来看下核心代码及视图:

    1. public static void main(String[] args) {
    2. //                利用自定义类型 为树形集合数据类型排序
    3.                
    4. //                1、java自带的数据类型 为什么可以自动排序呢?
    5. //                因为add方法里调用了 compareTo    java自带的数据类型都重写了 compareTo方法
    6. //                2、自定义类型怎么实现自动排序?
    7. //                根据1中的推理  我们也需要再自定义类中重写 compareTo方法 已到达按哪个字段排序的目的
    8. //                因为树形数据类型 是不存不知道怎么排序的集合的
    9.                
    10. //                返回值为0:已存在
    11. //                 返回值为正:放到后
    12. //                 返回值为负:放到前
    13.                
    14.                 TreeSet<Student> tss = new TreeSet<Student>();
    15.                 tss.add(new Student("b",9));
    16.                 tss.add(new Student("f",8));
    17.                 tss.add(new Student("a",20));
    18.                 tss.add(new Student("c",19));
    19.                 tss.add(new Student("b",18));
    20.                 tss.add(new Student("b",18));
    21.                 System.out.println(tss);
    22.                
    23.         }
    复制代码


      

    1. public int compareTo(Student o) {
    2.                 // TODO Auto-generated method stub
    3.                 int res = this.age - o.age;
    4.                
    5. //        假如年龄相等按照名称排序
    6.                 if(res == 0){
    7.                         String name1 = this.name;
    8.                         String name2 = o.name;
    9.                         return name1.compareTo(name2);
    10.                 }else{
    11.                         return res;
    12.                 }
    13.         }
    复制代码



    1、图中的compareTo为什么有参数?       比较需要二个对象进行比较 一个是之前的数据 this  一个是通过参数传进来的对象  也就是传统的A类调用B类
    2、第二种:可以利用多态 将比较方法提取出来放到一个类中  然后将此类对象作为TreeSet的 成员属性  通过TreeSet的构造方法为成员属性赋值 如下图:

    第二种方法的灵活性比较高可以按多种选择进行排序。实例代码:

    1. //比较器类
    2. public class Comp1 implements Comparator<Book> {
    3.         @Override
    4.         public int compare(Book o1, Book o2) {
    5.                 // TODO Auto-generated method stub
    6. //                先按编号排序在按书名排序
    7.                 int res = o1.getNum() - o2.getNum();
    8.                
    9.                 if(res == 0){
    10.                         String name1 = o1.getName();
    11.                         String name2 = o2.getName();
    12.                         return name1.compareTo(name2);
    13.                 }else{
    14.                         return res;
    15.                 }
    16.         }
    17. }
    复制代码


      

    1. TreeSet<Book> ts = new TreeSet<Book>(new Comp1());
    2.                 ts.add(new Book("葵花宝典", 2));
    3.                 ts.add(new Book("九阴真经",1));
    4.                 System.out.println(ts);
    复制代码


      
    总结:正负决定排序规则
    树形结构如何保证数据唯一性?
    1、HashSet和LinkedHashSet 我们自定义类需要重写hashCode和equals方法
    2、TreeSet 自定义类时需要重写compareTo方法
    3、TreeSet 自定义类时可以创建比较器类
    集合排序总结:
    1、List集合 可以自己写排序 (冒泡或者选择)
    2、Set集合
         1)hashSet和LinkedHashSet   无法排序
      2)TreeSet 自然排序 和自定义类型排序(可以利用compareTo和编写比较器来进行排序)【目的只是为了能够存自定义类型的数据】
    3、Map集合同Set集合一样
    4、Collections工具类中一些方法的操作只针对List集合(不针对没有下标的集合)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-5-11 04:29 , Processed in 0.308128 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表