Java基础篇自然排序和定制排序
排序目录
- 1. 自然排序
- 1.1 排序说明
- 1.2 基于Comparable 的实现样例
- 1.3 实现方式展示
- 2. 定制排序
- 2.1 排序说明
- 2.2 实现方式展示
说明
此篇文章是在学习到集合TreeSet内容时了解到的两种排序
1. 自然排序
1.1 排序说明
【比较重要】
①自然排序:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列
②如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现Comparable接口。
③实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj) 方法的返回值来比较大小。
1.2 基于Comparable 的实现样例
①BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
②Character:按字符的 unicode值来进行比较
③Boolean:true 对应的包装类实例大于 false 对应的包装类实例
④String:按字符串中字符的 unicode 值进行比较
⑤Date、Time:后边的时间、日期比前面的时间、日期大
1.3 实现方式展示
练习题目
1. 定义一个 Employee 类。
该类包含:private 成员变量 name,age,birthday,其中 birthday 为MyDate 类的对象;
并为每一个属性定义 getter, setter 方法;
并重写 toString 方法输出 name, age, birthday
2.MyDate 类包含:
private 成员变量 year,month,day;并为每一个属性定义 getter, setter
方法;
3.实现类:创建该类的 5 个对象,并把这些对象放入 TreeSet 集合中(下一章:
TreeSet 需使用泛型来定义)
分别按以下两种方式对集合中的元素进行排序,并遍历输出:
1). 使 Employee 实现 Comparable 接口,并按 name 排序
实现代码展示
Mydate类
public class MyDate {private int year;private int month;private int day;public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}public MyDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public MyDate() {}@Overridepublic String toString() {return "year=" + year +", month=" + month +", day=" + day;}
}
Employee类
public class Employee implements Comparable{private String name;private int age;private MyDate birthday;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 MyDate getBirthday() {return birthday;}public void setBirthday(MyDate birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", birthday={" + birthday +'}'+'}';}@Overridepublic int compareTo(Object o) {if (o instanceof Employee){Employee employee = (Employee) o;return this.name.compareTo(employee.name);}else {throw new RuntimeException("输入的格式有误");}}public Employee() {}public Employee(String name, int age, MyDate birthday) {this.name = name;this.age = age;this.birthday = birthday;}
}
测试类:
public class TreeSetTest {public static void main(String[] args) {TreeSet set = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Employee && o2 instanceof Employee) {Employee employee = (Employee) o1;Employee employee1 = (Employee) o2;MyDate birthday1 = employee.getBirthday();MyDate birthday2 =employee1.getBirthday();int minusYear = birthday1.getYear() - birthday2.getYear();if (minusYear !=0){return minusYear;}else {int minusMonth = birthday1.getMonth() - birthday2.getMonth();if (minusMonth != 0){return minusMonth;}else {return birthday1.getDay() - birthday2.getDay();}}}throw new RuntimeException("输入的数据类型不一致");}});Employee employee = new Employee("lihua", 20, new MyDate(2002, 3, 16));Employee employee1 = new Employee("liudehua", 24, new MyDate(1998, 1, 15));Employee employee2 = new Employee("liming", 25, new MyDate(1997, 2, 14));Employee employee3 = new Employee("zhangxueyou", 23, new MyDate(1999, 5, 15));Employee employee4 = new Employee("guofucheng", 21, new MyDate(2001, 3, 11));set.add(employee);set.add(employee1);set.add(employee2);set.add(employee3);set.add(employee4);Iterator iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
2. 定制排序
2.1 排序说明
【细读之后看例题便可加深理解】
①TreeSet的自然排序要求元素所属的类实现Comparable接口,如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。
②利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
③要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。
④此时,仍然只能向TreeSet中添加类型相同的对象。否则发ClassCastException异常。
⑤使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。
2.2 实现方式展示
练习题目
1. 定义一个 Employee 类。
该类包含:private 成员变量 name,age,birthday,其中 birthday 为MyDate 类的对象;
并为每一个属性定义 getter, setter 方法;
并重写 toString 方法输出 name, age, birthday
2.MyDate 类包含:
private 成员变量 year,month,day;并为每一个属性定义 getter, setter
方法;
3.实现类:创建该类的 5 个对象,并把这些对象放入 TreeSet 集合中(下一章:
TreeSet 需使用泛型来定义)
分别按以下两种方式对集合中的元素进行排序,并遍历输出:
1). 使 Employee 实现 Comparable 接口,并按 name 排序
说明
和上一个例题是一样的,知识要求实现排序的方式不同,前两个实现类是一样的,为节省空间这里还不再提供。
实现代码展示
测试类:
public class TreeSetTest {public static void main(String[] args) {Employee employee = new Employee("lihua", 20, new MyDate(2002, 3, 16));Employee employee1 = new Employee("liudehua", 24, new MyDate(1998, 1, 15));Employee employee2 = new Employee("liming", 25, new MyDate(1997, 2, 14));Employee employee3 = new Employee("zhangxueyou", 23, new MyDate(1999, 5, 15));Employee employee4 = new Employee("guofucheng", 21, new MyDate(2001, 3, 11));set.add(employee);set.add(employee1);set.add(employee2);set.add(employee3);set.add(employee4);Iterator iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
Java基础篇自然排序和定制排序相关推荐
- Day48(List接口,ArrayList,LinkedList,Vector,Set接口,HashSet,LinkedHashSet,TreeSet,自然排序,定制排序)
Collection子接口之一:List接口 List接口概述 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中元素有序.且可重复,集合中的每个元素都有其对应的顺 ...
- TreeSet的自然排序和定制排序
只要放在TreeSet中的元素对象,在该对象的类中必须实现Comparable接口,必须覆盖该接口中的compareTo()方法,并在该方法中编写比较规则.(该方法不能自动生成) 自然排序(Compa ...
- Java基础篇:Java集合
文章目录 1.概述 2.Collection接口 2.1 Collection接口方法 2.2 Iterator迭代器接口 2.3 Collection子接口之:List接口 2.4 Collecti ...
- 菜鸟学习笔记:Java基础篇6(数组、字符串)
菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...
- 《Java 后端面试经》Java 基础篇
<Java 后端面试经>专栏文章索引: <Java 后端面试经>Java 基础篇 <Java 后端面试经>Java EE 篇 <Java 后端面试经>数 ...
- Java基础篇--Java 数组
Java基础篇--Java 数组 Java 数组 声明数组变量 创建数组 处理数组 For-Each 循环 数组作为函数的参数 数组作为函数的返回值 多维数组 多维数组的动态初始化(以二维数组为例) ...
- Java基础篇4——数组
Java基础篇4--数组 1.数组的概念 当需要在Java程序中记录单个数据内容时,则声明一个变量即可 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数 组即可,一维数组本质上就是 ...
- 高频面试真题答案 -java后端 -java基础篇
原贴 2022届秋招高频面试真题汇总,千题奉送!!!- 后端篇_笔经面经_牛客网 整理答案: 类加载机制 47 双亲委派机制 24 new一个对象的过程 4 java程序是如何运行起来的? 1 jvm ...
- 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)
菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...
最新文章
- 获取线程中抛出的异常信息
- Yarn基本架构和工作机制
- AX中对Programmable section的动态控制
- java用easyexcel实现读取excell表格内容
- Java_FileInputStream_读一个文件
- alibaba fastJson框架快速解析复杂有重复性质的json
- Python稳基修炼之计算机等级考试易错细节题4(含答案)
- linux里面安装php,linux下怎么安装php环境
- 机器学习中的两个概率模型
- nginx 的基本配置
- java项目飞机大战
- 【AndroidStudio】手机QQ登录界面2022版
- 微信线下门店二维码扫码支付和退款
- Navicat执行sql文件没反应
- 如何利用树莓派制作路由器
- 2018 ACM ICPC Arabella Collegiate Programming Contest A
- visio移动变得很卡的解决办法
- 计算机主机背影便接口,装机日记二 背影哥手把手教你攒电脑
- 合并报表编制采用的理论_合并报表编制理论知识(必读)详解
- 看《越狱》体会项目管理-知识管理-性格分析
热门文章
- (29)FPGA实现AD7768接口(八)
- 2020-11-19 吴恩达DL学习-C5 序列模型-W3 序列模型和注意力机制(3.4 改进定向搜索-长度归一化,称为归一化的对数似然目标函数。取每个单词的概率对数值的平均。非精确搜索,速度快)
- 山海鲸可视化凭借技术优势打造高性价比数字孪生
- 响应式编程(一)什么是响应式编程
- lcs leetcode1143 dp
- 网络性能测试仪该买什么品牌
- 关于定制 android 恢复出厂设置的一点思路
- 分享一个Python 在线编辑器
- 案例:分组求top1、求topN
- 关于一个小bai调试了3小时不停在找错最终使程序跑起来的悲惨故事。。。