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()排序,以及自定义排序规则相关推荐

  1. 编写book.java_Java集合框架上机练习题:编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法........

    编写一个Book类,该类至少有name和price两个属性.该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系.在 ...

  2. 集合与泛型集合与键值对集合

    1,集合 (Connections) ArrayList arr = new ArrayList();//可以add arr.Add("Hello girls!");//支持添加o ...

  3. 扑克牌自定义排序,使用集合TreeSet实现实体对象排序,通过实现Comparable接口,重写compareTo比较器;

    一.继承Comparable实现排序 下面以扑克牌为例: 首先创建扑克实体类继承Comparable<Poker>接口: public class Poker implements Com ...

  4. C#泛型集合定义及使用

    C# 语言中泛型集合是泛型中最常见的应用,主要用于约束集合中存放的元素. 由于在集合中能存放任意类型的值,在取值时经常会遇到数据类型转换异常的情况,因此推荐在定义集合时使用泛型集合. 前面<C# ...

  5. Sort方法根据T类某个字段对泛型集合ListT排序

    实现:采用Sort方法根据T类某个字段对泛型集合List<T>排序. 实现代码如下: static void Main(string[] args){List<Stud> st ...

  6. 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()

    对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...

  7. List泛型集合总结(一)

    为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接将对象放入ArrayList,操作直观,但由于集合中的项是Object类型,因此每次使用都必须 ...

  8. C#中的集合、哈希表、泛型集合、字典

    集合ArrayList 集合:集合可以看做是数组,可以将其看成"长度可变,具有很多方法的数组".使用ArrayList,首先需要导入命名空间using.system.collect ...

  9. 自定义泛型集合,接口

    自定义泛型集合 package C12_21;public class abstractList {public static void main(String[] args) {stu<Str ...

最新文章

  1. springmvc原理详解(手写springmvc)
  2. add svn 多个文件_深圳信狮SVN技术文档
  3. one-to-many many-to-one 为什么只生成了一张表呢?
  4. 【中级软考】什么是实时操作系统?(RTOS:Real Time Operating System)
  5. 【转】jsp+servlet和SSM分别是如何实现文件上传(示例)
  6. 你不知道的那些console
  7. bootstraptable 加载完成回调函数_牛皮了!头一次见有大佬把「JavaScript中的回调函数」详解得如此清晰明了...
  8. poj2828 Buy Tickets
  9. GB28181协议--心跳
  10. python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)
  11. mysql数据库双机备份_MySQL数据库双机热备份
  12. Astah 三分钟学会躺着画UML时序图
  13. UML-类 图 (2)
  14. [USACO09OCT]谷仓里的回声Barn Echoes(hush、STL)
  15. 【Shell】Shell 脚本自动输入密码的三种方式
  16. [UE4]设置虚幻引擎的Visual Studio
  17. “左眼跳财,右眼跳灾”
  18. 初中计算机卡片的制作教案,《运用Word制作电子贺卡》教学设计
  19. 如何修改linux文件生成日期,我如何更改文件的修改/创建日期?
  20. 凝血酶分子机器人_厉害啊!中科院团队发明世界第一个智能抗癌DNA纳米机器人《星际之门:亚特兰蒂斯》...

热门文章

  1. LInux命令行参数
  2. percona+mysql插件_使用percona mysql插件来监控mysql5.7
  3. 华大 MCU 之四 使用问题记录
  4. 面向对象3(final、static、instanceof、向上/向下转型、初始化次序)
  5. wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用
  6. OS / Linux / 文件描述符以及 file 结构体
  7. 启明云端分享|ESP32-S3 Smartconfig一键配网
  8. Altium designer中高亮元器件或网络时对比度调节
  9. ESD二极管,替代国际品牌型号汇总
  10. linux串口boost,Boost串口通信第一课 boost::asio::serial_port基本使用