排序目录

  • 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基础篇自然排序和定制排序相关推荐

  1. Day48(List接口,ArrayList,LinkedList,Vector,Set接口,HashSet,LinkedHashSet,TreeSet,自然排序,定制排序)

    Collection子接口之一:List接口 List接口概述 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中元素有序.且可重复,集合中的每个元素都有其对应的顺 ...

  2. TreeSet的自然排序和定制排序

    只要放在TreeSet中的元素对象,在该对象的类中必须实现Comparable接口,必须覆盖该接口中的compareTo()方法,并在该方法中编写比较规则.(该方法不能自动生成) 自然排序(Compa ...

  3. Java基础篇:Java集合

    文章目录 1.概述 2.Collection接口 2.1 Collection接口方法 2.2 Iterator迭代器接口 2.3 Collection子接口之:List接口 2.4 Collecti ...

  4. 菜鸟学习笔记:Java基础篇6(数组、字符串)

    菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...

  5. 《Java 后端面试经》Java 基础篇

    <Java 后端面试经>专栏文章索引: <Java 后端面试经>Java 基础篇 <Java 后端面试经>Java EE 篇 <Java 后端面试经>数 ...

  6. Java基础篇--Java 数组

    Java基础篇--Java 数组 Java 数组 声明数组变量 创建数组 处理数组 For-Each 循环 数组作为函数的参数 数组作为函数的返回值 多维数组 多维数组的动态初始化(以二维数组为例) ...

  7. Java基础篇4——数组

    Java基础篇4--数组 1.数组的概念 当需要在Java程序中记录单个数据内容时,则声明一个变量即可 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数 组即可,一维数组本质上就是 ...

  8. 高频面试真题答案 -java后端 -java基础篇

    原贴 2022届秋招高频面试真题汇总,千题奉送!!!- 后端篇_笔经面经_牛客网 整理答案: 类加载机制 47 双亲委派机制 24 new一个对象的过程 4 java程序是如何运行起来的? 1 jvm ...

  9. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

最新文章

  1. 获取线程中抛出的异常信息
  2. Yarn基本架构和工作机制
  3. AX中对Programmable section的动态控制
  4. java用easyexcel实现读取excell表格内容
  5. Java_FileInputStream_读一个文件
  6. alibaba fastJson框架快速解析复杂有重复性质的json
  7. Python稳基修炼之计算机等级考试易错细节题4(含答案)
  8. linux里面安装php,linux下怎么安装php环境
  9. 机器学习中的两个概率模型
  10. nginx 的基本配置
  11. java项目飞机大战
  12. 【AndroidStudio】手机QQ登录界面2022版
  13. 微信线下门店二维码扫码支付和退款
  14. Navicat执行sql文件没反应
  15. 如何利用树莓派制作路由器
  16. 2018 ACM ICPC Arabella Collegiate Programming Contest A
  17. visio移动变得很卡的解决办法
  18. 计算机主机背影便接口,装机日记二 背影哥手把手教你攒电脑
  19. 合并报表编制采用的理论_合并报表编制理论知识(必读)详解
  20. 看《越狱》体会项目管理-知识管理-性格分析

热门文章

  1. (29)FPGA实现AD7768接口(八)
  2. 2020-11-19 吴恩达DL学习-C5 序列模型-W3 序列模型和注意力机制(3.4 改进定向搜索-长度归一化,称为归一化的对数似然目标函数。取每个单词的概率对数值的平均。非精确搜索,速度快)
  3. 山海鲸可视化凭借技术优势打造高性价比数字孪生
  4. 响应式编程(一)什么是响应式编程
  5. lcs leetcode1143 dp
  6. 网络性能测试仪该买什么品牌
  7. 关于定制 android 恢复出厂设置的一点思路
  8. 分享一个Python 在线编辑器
  9. 案例:分组求top1、求topN
  10. 关于一个小bai调试了3小时不停在找错最终使程序跑起来的悲惨故事。。。