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,调用次方法的对象
* 指定对象:参数传进来的对象
* */
@Override
public int compareTo(num o) {
return this.num>o.num?1:this.num==o.num?0:-1;
}
}
运行后效果,先排序后遍历输出,后输出最大最小值,再输出一个指定对象所在集合的下标

自定义排序规则

以此案例为例子解释
如果我们不想比学生的学号大小,假如现在要求按照学生成绩排序,那我们就根据成绩排序来做一个成绩排行榜,只需要在 compareTo 方法中把比较的参数换一下就行,比如原本是调用num这个属性,换成 this.age 和 参数对象.age 比较即可。
(此工具类有一个很好地特性,如果比较成绩,两个成绩相同,则会比较与之相邻的下一个数值型的值,判断大小来以此排列)
偏实用派的人推荐直接看这篇文章,言简意赅:Collections comparable_Azadoo的博客-优快云博客
Java中Collections.sort()排序详解与自定义规则
本文介绍了Java中Collections.sort()方法的使用,包括如何对泛型集合进行排序,以及如何让自定义类实现Comparable<T>接口以完成排序。同时,文章讲解了自定义排序规则,例如根据学生类的学号或成绩进行排序。在实际操作部分,展示了排序、查找最大值和最小值的效果,并强调了使用Collections.sort()前需要确保集合元素满足Comparable接口或自定义比较逻辑。
1397





