Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则
Collections算法类
1.Collections类是Java提供的一个集合操作工具类。
2.Collections类定义了一系列用于操作集合的静态方法,用于实现对集合元素的排序、查找和替换等操作。
3.Collections和Collection是不同的,前者是集合的操作类,后者是集合接口
Collections的常用静态方法(不是所有的方法)
1.sort(集合对象):排序
2.binarySearch(集合对象):折半查找——返回查找对象下标位置
3.max(集合对象) \ min(集合对象):查找最大\最小值——返回查找到的对象
Collections排序
1.实现一个类的对象之间比较大小,该类要实现Comparable<T>接口(T为通配符,匹配一个类型,实现该接口需要传入实现类作为泛型约束)
2.重写 Comparable<T>接口 的 public int compareTo(T o)方法 。
3.实现方法返回值约定:如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数
Collections排序案例:
学生类Student实现了Comparable<Student>接口,重写 compareTo(Student o)方法,通过比较学号实现对象之间的大小比较。
注意
1. 使用Collections.sort(集合对象)排序时,如果集合中存的是Java自带的类型的数据,如Integer,则不需要该类型内实现Comparable<T>接口(阅读源码可发现其内部已自动实现接口重写方法),如果是自定义类型,如num类,Student类,则需要实现Comparable<T>并重写 public int compareTo(T o)方法。
2.调用Collections.max和min不需要先排序,但是如果使用折半查找则必须先Collections.sort(集合对象)排序,不然折半查找不论是否存在都返回-1;
3.实现compareTo(T o)方法,我们只要根据要求,对传入参数的相关数值进行判断比较,并返回相应的负整数零或者正整数即可,不需要关心比大小的具体实现,因为调用Collections.sort()方法后,其工具类会有相应的方法调用我们重写好的compareTo(T o)方法来使用。
实际操作
public class Test {public static void main(String[] args) {//创建集合并添加值List list = new ArrayList();list.add(new num(3));list.add(new num(2));list.add(new num(1));//调用排序方法Collections.sort(list);//输出排序后结果for (Object o: list) {System.out.println(((num)o).getNum());}System.out.println();//输出最大最小值System.out.println(((num)Collections.max(list)).getNum());System.out.println(((num)Collections.min(list)).getNum());System.out.println();//输出一个类型的在集合中的下标位置System.out.println((Collections.binarySearch(list,new num(1))));System.out.println();}
}class num implements Comparable<num>{private int num;public num(int num) {this.num = num;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}/** 重写的compareTo(num o)方法* 如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。* 该对象:this,调用次方法的对象* 指定对象:参数传进来的对象* */@Overridepublic int compareTo(num o) {return this.num>o.num?1:this.num==o.num?0:-1;}
}
运行后效果,先排序后遍历输出,后输出最大最小值,再输出一个指定对象所在集合的下标
自定义排序规则
以此案例为例子解释
如果我们不想比学生的学号大小,假如现在要求按照学生成绩排序,那我们就根据成绩排序来做一个成绩排行榜,只需要在 compareTo 方法中把比较的参数换一下就行,比如原本是调用num这个属性,换成 this.age 和 参数对象.age 比较即可。
(此工具类有一个很好地特性,如果比较成绩,两个成绩相同,则会比较与之相邻的下一个数值型的值,判断大小来以此排列)
偏实用派的人推荐直接看这篇文章,言简意赅:Collections comparable_Azadoo的博客-CSDN博客
Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则相关推荐
- 编写book.java_Java集合框架上机练习题:编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法........
编写一个Book类,该类至少有name和price两个属性.该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系.在 ...
- 集合与泛型集合与键值对集合
1,集合 (Connections) ArrayList arr = new ArrayList();//可以add arr.Add("Hello girls!");//支持添加o ...
- 扑克牌自定义排序,使用集合TreeSet实现实体对象排序,通过实现Comparable接口,重写compareTo比较器;
一.继承Comparable实现排序 下面以扑克牌为例: 首先创建扑克实体类继承Comparable<Poker>接口: public class Poker implements Com ...
- C#泛型集合定义及使用
C# 语言中泛型集合是泛型中最常见的应用,主要用于约束集合中存放的元素. 由于在集合中能存放任意类型的值,在取值时经常会遇到数据类型转换异常的情况,因此推荐在定义集合时使用泛型集合. 前面<C# ...
- Sort方法根据T类某个字段对泛型集合ListT排序
实现:采用Sort方法根据T类某个字段对泛型集合List<T>排序. 实现代码如下: static void Main(string[] args){List<Stud> st ...
- 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()
对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...
- List泛型集合总结(一)
为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接将对象放入ArrayList,操作直观,但由于集合中的项是Object类型,因此每次使用都必须 ...
- C#中的集合、哈希表、泛型集合、字典
集合ArrayList 集合:集合可以看做是数组,可以将其看成"长度可变,具有很多方法的数组".使用ArrayList,首先需要导入命名空间using.system.collect ...
- 自定义泛型集合,接口
自定义泛型集合 package C12_21;public class abstractList {public static void main(String[] args) {stu<Str ...
最新文章
- springmvc原理详解(手写springmvc)
- add svn 多个文件_深圳信狮SVN技术文档
- one-to-many many-to-one 为什么只生成了一张表呢?
- 【中级软考】什么是实时操作系统?(RTOS:Real Time Operating System)
- 【转】jsp+servlet和SSM分别是如何实现文件上传(示例)
- 你不知道的那些console
- bootstraptable 加载完成回调函数_牛皮了!头一次见有大佬把「JavaScript中的回调函数」详解得如此清晰明了...
- poj2828 Buy Tickets
- GB28181协议--心跳
- python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)
- mysql数据库双机备份_MySQL数据库双机热备份
- Astah 三分钟学会躺着画UML时序图
- UML-类 图 (2)
- [USACO09OCT]谷仓里的回声Barn Echoes(hush、STL)
- 【Shell】Shell 脚本自动输入密码的三种方式
- [UE4]设置虚幻引擎的Visual Studio
- “左眼跳财,右眼跳灾”
- 初中计算机卡片的制作教案,《运用Word制作电子贺卡》教学设计
- 如何修改linux文件生成日期,我如何更改文件的修改/创建日期?
- 凝血酶分子机器人_厉害啊!中科院团队发明世界第一个智能抗癌DNA纳米机器人《星际之门:亚特兰蒂斯》...
热门文章
- LInux命令行参数
- percona+mysql插件_使用percona mysql插件来监控mysql5.7
- 华大 MCU 之四 使用问题记录
- 面向对象3(final、static、instanceof、向上/向下转型、初始化次序)
- wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用
- OS / Linux / 文件描述符以及 file 结构体
- 启明云端分享|ESP32-S3 Smartconfig一键配网
- Altium designer中高亮元器件或网络时对比度调节
- ESD二极管,替代国际品牌型号汇总
- linux串口boost,Boost串口通信第一课 boost::asio::serial_port基本使用