TreeSet的两种排序方式
TreeSet的两种排序方式
1.排序的引入
- public class TreeSetDemo {
- public static void main(String[] args) {
- // 创建集合对象
- // 自然顺序进行排序
- TreeSet<Integer> ts = new TreeSet<Integer>();
- // 创建元素并添加
- // 20,18,23,22,17,24,19,18,24
- ts.add(20);
- ts.add(18);
- ts.add(23);
- ts.add(22);
- ts.add(17);
- ts.add(24);
- ts.add(19);
- ts.add(18);
- ts.add(24);
- // 遍历
- for (Integer i : ts) {
- System.out.println(i);
- }
- }
- }
public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象// 自然顺序进行排序TreeSet<Integer> ts = new TreeSet<Integer>();// 创建元素并添加// 20,18,23,22,17,24,19,18,24ts.add(20);ts.add(18);ts.add(23);ts.add(22);ts.add(17);ts.add(24);ts.add(19);ts.add(18);ts.add(24);// 遍历for (Integer i : ts) {System.out.println(i);}}
}
- public class TreeSetDemo02 {
- public static void main(String[] args) {
- TreeSet<Student> ts=new TreeSet<Student>();
- //创建元素对象
- Student s1=new Student(“zhangsan”,20);
- Student s2=new Student(“lis”,22);
- Student s3=new Student(“wangwu”,24);
- Student s4=new Student(“chenliu”,26);
- Student s5=new Student(“zhangsan”,22);
- Student s6=new Student(“qianqi”,24);
- //将元素对象添加到集合对象中
- ts.add(s1);
- ts.add(s2);
- ts.add(s3);
- ts.add(s4);
- ts.add(s5);
- ts.add(s6);
- //遍历
- for(Student s:ts){
- System.out.println(s.getName()+”———–”+s.getAge());
- }
- }
- }
public class TreeSetDemo02 {public static void main(String[] args) {TreeSet<Student> ts=new TreeSet<Student>(); //创建元素对象Student s1=new Student("zhangsan",20);Student s2=new Student("lis",22);Student s3=new Student("wangwu",24);Student s4=new Student("chenliu",26);Student s5=new Student("zhangsan",22);Student s6=new Student("qianqi",24);//将元素对象添加到集合对象中ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);//遍历for(Student s:ts){System.out.println(s.getName()+"-----------"+s.getAge());}}
}
- public class Student {
- private String name;
- private int age;
- public Student() {
- super();
- // TODO Auto-generated constructor stub
- }
- public Student(String name, int age) {
- super();
- 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;
- }
- }
public class Student {private String name;private int age;public Student() {super();// TODO Auto-generated constructor stub} public Student(String name, int age) {super();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;}
}
运行结果:
2.自然排序
int
|
compareTo(T o) 比较此对象与指定对象的顺序。 |
- package xfcy_04;
- /**
- * Student类
- * @author 晓风残月
- *
- */
- public class Student implements Comparable<Student> {
- private String name;
- private int age;
- public Student() {
- super();
- // TODO Auto-generated constructor stub
- }
- public Student(String name, int age) {
- super();
- 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 int compareTo(Student s) {
- //return -1; //-1表示放在红黑树的左边,即逆序输出
- //return 1; //1表示放在红黑树的右边,即顺序输出
- //return o; //表示元素相同,仅存放第一个元素
- //主要条件 姓名的长度,如果姓名长度小的就放在左子树,否则放在右子树
- int num=this.name.length()-s.name.length();
- //姓名的长度相同,不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。
- //如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。
- //如果这两个字符串相等,则结果为 0
- int num1=num==0?this.name.compareTo(s.name):num;
- //姓名的长度和内容相同,不代表年龄相同,所以还要判断年龄
- int num2=num1==0?this.age-s.age:num1;
- return num2;
- }
- }
package xfcy_04;
/*** Student类* @author 晓风残月**/
public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();// TODO Auto-generated constructor stub} public Student(String name, int age) {super();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;}@Overridepublic int compareTo(Student s) {//return -1; //-1表示放在红黑树的左边,即逆序输出//return 1; //1表示放在红黑树的右边,即顺序输出//return o; //表示元素相同,仅存放第一个元素//主要条件 姓名的长度,如果姓名长度小的就放在左子树,否则放在右子树int num=this.name.length()-s.name.length(); //姓名的长度相同,不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。//如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。//如果这两个字符串相等,则结果为 0int num1=num==0?this.name.compareTo(s.name):num;//姓名的长度和内容相同,不代表年龄相同,所以还要判断年龄int num2=num1==0?this.age-s.age:num1;return num2;}}
- package xfcy_04;
- import java.util.TreeSet;
- /*
- * TreeSet存储自定义对象并保证排序和唯一。
- *
- * 需求:请按照姓名的长度排序
- */
- public class TreeSetDemo02 {
- public static void main(String[] args) {
- //创建集合对象
- TreeSet<Student> ts=new TreeSet<Student>();
- //创建元素对象
- Student s1=new Student(“zhangsan”,20);
- Student s2=new Student(“lis”,22);
- Student s3=new Student(“wangwu”,24);
- Student s4=new Student(“chenliu”,26);
- Student s5=new Student(“zhangsan”,22);
- Student s6=new Student(“qianqi”,24);
- //将元素对象添加到集合对象中
- ts.add(s1);
- ts.add(s2);
- ts.add(s3);
- ts.add(s4);
- ts.add(s5);
- ts.add(s6);
- //遍历
- for(Student s:ts){
- System.out.println(s.getName()+”———–”+s.getAge());
- }
- }
- }
package xfcy_04;import java.util.TreeSet;/*
* TreeSet存储自定义对象并保证排序和唯一。* * 需求:请按照姓名的长度排序*/
public class TreeSetDemo02 {public static void main(String[] args) {//创建集合对象 TreeSet<Student> ts=new TreeSet<Student>();//创建元素对象Student s1=new Student("zhangsan",20);Student s2=new Student("lis",22);Student s3=new Student("wangwu",24);Student s4=new Student("chenliu",26);Student s5=new Student("zhangsan",22);Student s6=new Student("qianqi",24);//将元素对象添加到集合对象中ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);//遍历for(Student s:ts){System.out.println(s.getName()+"-----------"+s.getAge());}}
}
3、比较器排序
int
|
compare(T o1,T o2) 比较用来排序的两个参数。 |
TreeSet(Comparator<? superE> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。 |
- package xfcy_04;
- import java.util.TreeSet;
- /*
- * TreeSet存储自定义对象并保证排序和唯一。
- *
- * 需求:请按照姓名的长度排序
- */
- public class TreeSetDemo02 {
- public static void main(String[] args) {
- //创建集合对象
- //TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
- TreeSet<Student> ts=new TreeSet<Student>(new MyComparator());
- //创建元素对象
- Student s1=new Student(“zhangsan”,20);
- Student s2=new Student(“lis”,22);
- Student s3=new Student(“wangwu”,24);
- Student s4=new Student(“chenliu”,26);
- Student s5=new Student(“zhangsan”,22);
- Student s6=new Student(“qianqi”,24);
- //将元素对象添加到集合对象中
- ts.add(s1);
- ts.add(s2);
- ts.add(s3);
- ts.add(s4);
- ts.add(s5);
- ts.add(s6);
- //遍历
- for(Student s:ts){
- System.out.println(s.getName()+”———–”+s.getAge());
- }
- }
- }
package xfcy_04;import java.util.TreeSet;/*
* TreeSet存储自定义对象并保证排序和唯一。* * 需求:请按照姓名的长度排序*/
public class TreeSetDemo02 {public static void main(String[] args) {//创建集合对象//TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。TreeSet<Student> ts=new TreeSet<Student>(new MyComparator());//创建元素对象Student s1=new Student("zhangsan",20);Student s2=new Student("lis",22);Student s3=new Student("wangwu",24);Student s4=new Student("chenliu",26);Student s5=new Student("zhangsan",22);Student s6=new Student("qianqi",24);//将元素对象添加到集合对象中ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);//遍历for(Student s:ts){System.out.println(s.getName()+"-----------"+s.getAge());}}
}
- package xfcy_04;
- import java.util.Comparator;
- public class MyComparator implements Comparator<Student>{
- @Override
- public int compare(Student s1,Student s2) {
- // 姓名长度
- int num = s1.getName().length() - s2.getName().length();
- // 姓名内容
- int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
- // 年龄
- int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
- return num3;
- }
- }
package xfcy_04;import java.util.Comparator;public class MyComparator implements Comparator<Student>{@Overridepublic int compare(Student s1,Student s2) {// 姓名长度int num = s1.getName().length() - s2.getName().length();// 姓名内容int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;// 年龄int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;return num3;}}
学生类(不需要继承Comparetable接口)
- package xfcy_04;
- /**
- * Student类
- * @author 晓风残月
- *
- */
- public class Student{
- private String name;
- private int age;
- public Student() {
- super();
- // TODO Auto-generated constructor stub
- }
- public Student(String name, int age) {
- super();
- 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;
- }
- }
package xfcy_04;
/*** Student类* @author 晓风残月**/
public class Student{private String name;private int age;public Student() {super();// TODO Auto-generated constructor stub} public Student(String name, int age) {super();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;}}
4.比较器修改
- public class TreeSetDemo {
- public static void main(String[] args) {
- // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
- // 而匿名内部类就可以实现这个东西
- TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
- @Override
- public int compare(Student s1, Student s2) {
- // 姓名长度
- int num = s1.getName().length() - s2.getName().length();
- // 姓名内容
- int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
- : num;
- // 年龄
- int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
- return num3;
- }
- });
- // 创建元素
- Student s1 = new Student(“linqingxia”, 27);
- Student s2 = new Student(“zhangguorong”, 29);
- Student s3 = new Student(“wanglihong”, 23);
- Student s4 = new Student(“linqingxia”, 27);
- Student s5 = new Student(“liushishi”, 22);
- Student s6 = new Student(“wuqilong”, 40);
- Student s7 = new Student(“fengqingy”, 22);
- Student s8 = new Student(“linqingxia”, 29);
- // 添加元素
- ts.add(s1);
- ts.add(s2);
- ts.add(s3);
- ts.add(s4);
- ts.add(s5);
- ts.add(s6);
- ts.add(s7);
- ts.add(s8);
- // 遍历
- for (Student s : ts) {
- System.out.println(s.getName() + ”—” + s.getAge());
- }
- }
- }
public class TreeSetDemo {public static void main(String[] args) {// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象// 而匿名内部类就可以实现这个东西TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {// 姓名长度int num = s1.getName().length() - s2.getName().length();// 姓名内容int num2 = num == 0 ? s1.getName().compareTo(s2.getName()): num;// 年龄int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;return num3;}});// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}
}
5.总结
原文链接:http://blog.csdn.net/xiaofei__/article/details/53138681
TreeSet的两种排序方式相关推荐
- Java两种排序方式快慢比较
2019独角兽企业重金招聘Python工程师标准>>> Java中List的排序方式有两种,现在我们测试下这两种排序方式的快慢吧,我们需要用到两个类, 一个是运行程序的Main类,另 ...
- java treeset比较,java中TreeSet的两种排序比较的方式
第一种是使得元素具有比较性 第二种是让集合具有比较性 具体代码步骤如下: import java.util.*; /* * TreeSet:可以自动对对集合中的元素进行排序 * 第一种比较方式 * 步 ...
- mysql中两次排序_MySQL中的两种排序方式: index和filesort
index :通过有序索引顺序扫描直接返回有序数据,不需要额外的排序,操作效率较高. filesort:通过对返回数据进行排序,filesort 并不代表通过磁盘文件排序,而是说明进行了一个排序操作, ...
- 二分查找算法的两种实现方式:非递归实现和递归实现
二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...
- 快排的c++实现(两种实现方式)
快速排序算法是现在用的最广的排序算法,也是效率最高的.它有两种实现方式,一种是定轴法,另外一种是挖坑法.这里简单介绍一下两种实现方法的思想,并附上C++实现代码. (一)定轴法: 1.备份对轴(首记录 ...
- go kegg_玩转GO和KEGG富集因子图的N种姿势: 3种数据处理(含在线筛选条目),3种排序方式,本地交互图片...
适用场景 富集性分析是各组学进行数据分析的必备分析项,其中,尤以GO和KEGG富集因子图最为常见,见封面图.这张图非常经典,相比于其他富集分析结果,它包含了基因数目.p值和富集因子三个维度的信息量,更 ...
- 两种排序方法(直接判断)
题目描述 考拉有n个字符串字符串,任意两个字符串长度都是不同的.考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序.例如: "car" < "car ...
- halcon颜色识别的两种简单方式
颜色识别的两种简单方式: 1.单通道方式: 原理:通过不同颜色在灰度图中的阈值范围不同来区分颜色(理论上这种方式不推荐,但在一定情况下适用) 材料: halcon代码: dev_close_windo ...
- day06-元组字典集合常用两种排序
Day06-元组&字典&集合&常用两种排序 一.tuple元组 1.概述 和列表相似,本质上是一种有序的集合 元组和列表的不同之处: a.列表:[ ] 元组:( ) b ...
- C++中的两种绑定方式(静态绑定、动态绑定)
两种绑定方式 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类. 动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类. ...
最新文章
- leetcode(1)485——最大连续 1 的个数(C++)
- 47_pytorch循环神经网络(学习笔记)
- mha如何管理多套mysql集群_Mysql 集群高可用方案 MHA
- C# 值类型的局限性
- 低功耗/远距离lora模块:物联网智能家居、抄表多领域应用SX1262芯片方案
- 使用windows Phone 集成横幅广告教程
- docker安装es+kibana
- HTTPS数字证书原理
- Job for tomcat.service failed because the control process exited with error code 解决办法:
- 广东省中医院微信公众号医保个账支付功能
- cloudera-scm-agent start 启动失败
- 微信小程序新手留言板
- android官网m魅族15,还是熟悉的味道,魅族三款15系新机现身安卓官网
- XBox360-双光盘游戏自制GOD
- 从“历年全国出生人口”看,如何用Python来制作可视化动态图
- 单片机外设系列之一时钟芯片DS1302
- ubuntu WPS升级后打不开
- 自动为计算机配置ip的协议,电脑自动获取IP地址----DHCP动态主机配置协议
- 我的win7 64 激活过了,但是计算机-属性仍然显示“未激活此WIndows副本,单击此处立即激活...
- 代理商管理系统/代理商信息管理系统
热门文章
- Gucci“瑕疵”口红海报是一种对审“丑”广告的致敬吗?
- mysql 判断当前星期_MySQL获取星期的函数
- Day434.订单库存服务分布式事务的最终解决 -谷粒商城
- 2017年中国网络安全报告
- 啸叫抑制(howling suppression)
- Top100图神经网络论文大盘点
- 使用 Ubuntu 搭建 Minecraft 官方或Mod(Forge)服务器
- 人月神话(二)——为什么巴比伦塔会失败
- Unity3D之FingerGestures使用
- Raspberry Pi 上手准备