java利用自定义类型对树形数据类型进行排序
前言
为什么集合在存自定义类型时需要重写equals和hashCode?
1、先说List集合
List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了!
因为我们通常判断一个对象是否在集合中存在只需要判断值就行 而List内部实现方法是用地址来进行判断的 因为我们在创建对象时即使是值都一样
但是内存地址不一样 所以也就无法判定 一个对象是否在另一个对象中存在 我们可以在自定义类中重写equals方法 只是值相等就证明该对象在集合中存在
2、在说Set集合
Set集合在存自定义类型的数据时 为了要保证唯一性(set集合的特点:数据是不能重复的)我们要重写hashCode(执行效率高) 和 equals 内部就会自动判断
如果数据相等就不添加否则就添加到集合中
不管是利用Set集合的TreeSet 还是用Map集合的TreeMap 这二个数据类型的共同点都是 只存知道怎么排序的集合这是为什么,如果我们要想存自定义类型的数据该怎么办?
是因为上面二个集合在add的时候内部调用了基本数据类型的compareTo方法(内部排序是先比较后排序) 这些数据类型(例如String、Double)内部都已经重写了compareTo方法 所以可以自动排序
而我们在上面二个集合中添加自定义类型的数据时 会报错编译不通过(因为树形数据类型 是不存不知道怎么排序的集合的) 就是因为 自定义类型不知道按什么排序 是添加不到上面集合中去的 这个时候我们也需要重写compareTo 按我们自定义类型中的某个字段排序就可以了。
重写compareTo是第一种方法 下面来看下核心代码及视图:
public static void main(String[] args) {
// 利用自定义类型 为树形集合数据类型排序
// 1、java自带的数据类型 为什么可以自动排序呢?
// 因为add方法里调用了 compareTo java自带的数据类型都重写了 compareTo方法
// 2、自定义类型怎么实现自动排序?
// 根据1中的推理 我们也需要再自定义类中重写 compareTo方法 已到达按哪个字段排序的目的
// 因为树形数据类型 是不存不知道怎么排序的集合的
// 返回值为0:已存在
// 返回值为正:放到后
// 返回值为负:放到前
TreeSet<Student> tss = new TreeSet<Student>();
tss.add(new Student("b",9));
tss.add(new Student("f",8));
tss.add(new Student("a",20));
tss.add(new Student("c",19));
tss.add(new Student("b",18));
tss.add(new Student("b",18));
System.out.println(tss);
}
public int compareTo(Student o) {
// TODO Auto-generated method stub
int res = this.age - o.age;
// 假如年龄相等按照名称排序
if(res == 0){
String name1 = this.name;
String name2 = o.name;
return name1.compareTo(name2);
}else{
return res;
}
}

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

第二种方法的灵活性比较高可以按多种选择进行排序。实例代码:
//比较器类
public class Comp1 implements Comparator<Book> { @Override
public int compare(Book o1, Book o2) {
// TODO Auto-generated method stub
// 先按编号排序在按书名排序
int res = o1.getNum() - o2.getNum(); if(res == 0){
String name1 = o1.getName();
String name2 = o2.getName();
return name1.compareTo(name2);
}else{
return res;
}
} }
TreeSet<Book> ts = new TreeSet<Book>(new Comp1());
ts.add(new Book("葵花宝典", 2));
ts.add(new Book("九阴真经",1));
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集合(不针对没有下标的集合)
java利用自定义类型对树形数据类型进行排序的更多相关文章
- Hadoop MapReduce编程 API入门系列之自定义多种输入格式数据类型和排序多种输出格式(十一)
推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...
- Java利用自定义注解、反射实现简单BaseDao
在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先 ...
- java MVC 自定义类型转换器(Formatter、AnnotationFormatterFactory)
下面一个事例,是将传入的一个身份证号,转换成一个对象(提取身份证号的地址.出身日期.性别等) 实体类 Person 有三个字段如下: String province; //地址 Date birthd ...
- java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)
package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...
- [原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- java编程排序之自定义类型的集合,按业务需求排序
自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object ...
- java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件
提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息. Java使用java.lang.annotation.Annotat ...
- 2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语
数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6 ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
随机推荐
- 开源软件:NoSql数据库 - 图数据库 Cassandra
转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...
- 修改hosts 流畅使用coursera
以管理员权限打开 C盘 -> Windows-> System32 -> drives -> etc -> hosts文件 在hosts文件最后写入 52.84.246 ...
- Android TabLayout 在宽屏幕上tab不能平均分配的问题解决
当TabLayout 在宽屏幕的设备上,如平板横屏的时候,tab的宽度超过一定值后,就不在平均分配宽度,而是居中显示.此时设置 app:tabMode="fixed"或者 top_ ...
- 用golang实现常用算法与数据结构——跳跃表(Skip list)
背景 最近在学习 redis,看到redis中使用 了skip list.在网上搜索了一下发现用 golang 实现的 skip list 寥寥无几,性能和并发性也不是特别好,于是决定自己造一个并发安 ...
- Spring-cloud(五) 使用Ribbon进行Restful请求
写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵. 主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意 ...
- 百度API-------热力图
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- [Codeforces 946G]Almost Increasing Array
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) .现在准许你删除任意一个数,删除之后需要修改最小的次数使序列单调递增.问最小次数. \(1\leq n\leq 200 ...
- [JLOI2015]城池攻占
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...
- Prison 监狱
[题目描述]Caima 王国中有一个奇怪的监狱,这个监狱一共有 P 个牢房,这些牢房一字排开,第 i 个仅挨着第 i+1 个(最后一个除外).现在正好牢房是满的.上级下发了一个释放名单,要求每天释放名 ...
- IO复用
IO复用:使得程序能同时监听多个文件描述符 select: select在一段指定的时间内,监听用户感兴趣的文件描述符的 读.写.异常事件. select(int nfds,fd_set* readf ...