P15 Collections

  • 1.常用功能
  • 2.Comparator 比较器
  • 3.简述 Comparable 和 Comparator 两个接口的区别
  • 4.练习
  • 5.拓展

系统:Win10
Java:1.8.0_333
IDEA:2020.3.4

1.常用功能

java.utils.Collections 是集合工具类,用来对集合进行操作。常用方法如下
public static <T> boolean addAll(Collection<T> c, T…elements):往集合中添加一些元素
public static void shuffle(List<?> list):打乱集合顺序
public static <T> void sort(List<T> list):将集合元素按默认规则排序
public static <T> void sort(List<T> list, Comparator<? super T>):将集合元素按指定规则排序

代码演示

public class CollectionsDemo01 {public static void main(String[] args) {ArrayList<String> list1 = new ArrayList<>();ArrayList<String> list2 = new ArrayList<>();// 原来的添加list1.add("a");list1.add("b");list1.add("c");list1.add("d");list1.add("e");System.out.println(list1);// public static <T> boolean addAll(Collection<T> c, T...elements):往集合中添加一些元素Collections.addAll(list2, "a", "b", "c", "d", "e");System.out.println("addAll添加元素:" + list2);// public static void shuffle(List<?> list):打乱集合顺序Collections.shuffle(list2);System.out.println("shuffle打乱集合顺序:" + list2);// public static <T> void sort(List<T> list):将集合元素按默认规则排序Collections.sort(list2);System.out.println("sort排序后的集合:" + list2);}
}

运行结果

我们这里采用排序后可以发现,元素按照 String 的默认顺序排序(升序)了,如果说我们想倒序或者按别的排序方式进行排序该怎么办呢?
我们可以看到常用方法里还有一个:public static <T> void sort(List<T> list, Comparator<? super T>) 没有使用,这个方法就是将集合中元素按指定规则进行排序

2.Comparator 比较器

我们在使用 public static <T> void sort(List<T> list) 这个方法排序 String 类型的时候,它的默认排序方式为什么是升序,这个默认规则是怎么定义出来的?
说到排序,简单的来说就是两个对象之间比较大小,那么在 Java 中提供了两种比较实现的方式,一种是采用 java.lang.Comparable 接口去实现,另一种是选择 java.util.Comparator 接口完成
我们采用的 public static <T> void sort(List<T> list) 这个方法完成的排序,其实要求了被排序的类型需要实现 Comparable 接口完成比较功能,在 String 类中的定义

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {// 实现Comparable接口的compareTo方法public int compareTo(String anotherString) {int len1 = value.length;int len2 = anotherString.value.length;int lim = Math.min(len1, len2);char v1[] = value;char v2[] = anotherString.value;int k = 0;while (k < lim) {char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2;}k++;}return len1 - len2;}
}

String 类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那当我们想要字符串按照第一个字符降序排列,那么就要修改 String 的源代码,这是不可能的,那么这个时候我们就可以使用 public static <T> void sort(List<T> list, Comparator<? super T>) 方法灵活实现了,这里就涉及到 Comparator 这个接口,位于 java.util 包下,排序是 Comparator 能实现的功能之一,该接口代表一个比较器,比较器具有可比性!顾名思义就是做排序的,确定两个对象谁排在前面,谁排在后面,比较的方法是
public int compare(String o1, String o2):比较两个参数的顺序
两个对象的比较的结果有三种:大于、等于、小于
如果按照升序排序,则 o1 小于 o2,返回(负数),相等返回 0,o1 大于 o2返回(正数),如果要按照降序排序,则 o1 小于 o2,返回(正数),相等返回 0,o1 大于 o2返回(负数)
测试如下

public class CollectionsDemo02 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();// 往集合中添加一些元素Collections.addAll(list, "a", "b", "c", "d", "e", "f", "g");// 【前面的减后面的】代表升序,【后面的减前面】的代表降序Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.charAt(0) - o2.charAt(0);}});System.out.println("升序排序:" + list);Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.charAt(0) - o1.charAt(0);}});System.out.println("降序排序:" + list);}
}

运行结果

3.简述 Comparable 和 Comparator 两个接口的区别

Comparable:强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的 compareTo 方法被称为的它的自然比较方法。只能在类中实现 compareTo() 一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过 Collections.sort(Array.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器
Comparator:强行对某个对象进行整体排序,可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精准控制。还可以使用 Comparator 来控制某些数据结构(如有序 set 或有序映射)的顺序,或者为那些没有自然顺序的对象 Collection 提供排序

4.练习

创建一个 Person 类,存储到 ArrayList 集合中,然后按年龄进行排序操作
Person 初始类

public class Person implements Comparable<Person> {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}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;}// 用于等会直接打印Person对象@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}// 实现比较方法,不然不能直接使用sort(List<T> list)方法@Overridepublic int compareTo(Person o) {return this.getAge() - o.getAge(); // 升序}
}

测试类

public class CollectionsDemo03 {public static void main(String[] args) {ArrayList<Person> list = new ArrayList<>();list.add(new Person("张三", 18));list.add(new Person("李四", 19));list.add(new Person("王二", 17));list.add(new Person("麻子", 20));// 按年龄进行升序排序Collections.sort(list); // 要求该集合中元素类型类:必须实现比较器Comparable接口// 增强for输出集合for (Person person : list) {System.out.println(person);}}
}

运行结果

5.拓展

如果在排序的时候,想要独立的定义规则去使用,可使用 sort(List<T> list, Comparator<? super T>) 方法自定义排序规则
创建一个学生类,存储到 ArrayList 集合中完成指定排序操作,排序规则

  1. 先按姓名升序
  2. 再按姓名长度升序(ab 排在 abc 前面)
  3. 最后按年龄升序

Student 初始类

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}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;}// 重写toString 方法,便于直接打印比较@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

测试类

public class CollectionsDemo04 {public static void main(String[] args) {// 创建集合并添加数据ArrayList<Student> list = new ArrayList<>();list.add(new Student("ZhangSan", 18));list.add(new Student("LiSi", 19));list.add(new Student("ZhangSa", 20));list.add(new Student("WangEr", 20));list.add(new Student("ZhangSang", 19));list.add(new Student("LiSi", 17));// 按指定规则排序:按姓名升序,姓名长度升序,年龄升序Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {String name1 = o1.getName();String name2 = o2.getName();int length1 = o1.getName().length();int length2 = o2.getName().length();// 3.姓名相同,按年龄升序if (o1.getName().equals(o2.getName())) {return o1.getAge() - o2.getAge();} else {int minLength = length1 < length2 ? length1 : length2;for (int i = 0; i < minLength;i++){if (name1.charAt(i) != name2.charAt(i)) {// 1.按姓名升序return name1.charAt(i) - name2.charAt(i);}}// 2.按姓名长度升序return length1 - length2;}}});for (Student student : list) {System.out.println(student);}}
}

运行结果

P15 Collections相关推荐

  1. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  2. Python标准库——collections模块的Counter类

    更多16 最近在看一本名叫<Python Algorithm: Mastering Basic Algorithms in the Python Language>的书,刚好看到提到这个C ...

  3. Collections.addAll() 的使用 以及和list.addAll() 的区别

    Collections 是java.util 下的一个类 ,可以直接使用 下面下一个往list 里面添加数据的方法 普通的写法 ArrayList<String> list = new A ...

  4. java.util.Collections.synchronizedSet()方法的使用

    下面的例子显示java.util.Collections.synchronizedSet()方法的使用 package com.;import java.util.*;public class Col ...

  5. Python collections 模块 namedtuple、Counter、defaultdict

    1. namedtuple 假设有两个列表,如下,要判断两个列表中的某一个索引值是否相等. In [7]: p = ['001', 'wohu', '100', 'Shaanxi']In [8]: t ...

  6. python namedtuple用法_Python的collections模块中namedtuple结构使用示例

    namedtuple 就是命名的 tuple,比较像 C 语言中 struct.一般情况下的 tuple 是 (item1, item2, item3,...),所有的 item 都只能按照 inde ...

  7. 通过C#实现集合类纵览.NET Collections及相关技术

    概述:在真正的对象化开发项目中,我们通常会将常用的业务实体抽象为特定的类,如Employee.Customer.Contact等,而多数的类之间会存在着相应的关联或依存关系,如Employee和Cus ...

  8. Python3中collections.OrderedDict介绍

    Python3中的collections模块实现了特定目标的容器,以提供Python标准内建容器dict.list.set和tuple的替代选择,包括namedtuple.deque.ChainMap ...

  9. Java学习总结:58(Collections工具类)

    Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...

最新文章

  1. POJ1548最小路径覆盖
  2. 数据网络卡顿怎么处理_监控网络卡顿怎么办
  3. SAP UI5和微信小程序框架里的全局变量
  4. java 泛型 通配符边界和类型形参边界的区别
  5. 《强化学习》中的第10章:基于函数逼近的同轨策略控制
  6. 一、网络知识 1.计算机网络原理
  7. vfp报表纸张设置_vfp教程之Visual Foxpro生成任意打印字段报表的实现
  8. vue-video-player的使用方法,vue-video-player在移动端点击画面不触发事件不能暂停播放的解决方法
  9. 抽象代数学习笔记三《群:对称性变换与对称性群》
  10. ip地址 k8s 显示pod_k8s Pod IP地址规划(CIDR)
  11. 宁皓网 react native 视频教程 ECMAScript6
  12. 【cvpr2022】ReSTR: Convolution-free Referring Image Segmentation Using Transformers
  13. matlab 三维 作图 坐标轴_matlab三维画图
  14. php程序员会查乙肝吗,程序员被骗婚自杀,大家为何逮住“乙肝”不放?
  15. Python学习心得(一):词频统计,自顶向下设计
  16. 程序员快速熟悉新项目和业务逻辑的技巧
  17. 【TS TSP】基于matlab禁忌搜索算法求解31城市旅行商问题【含Matlab源码 1143期】
  18. JavaWeb学习笔记五:BS结构系统的结构和协议
  19. 时序分析(14) GMM (Generalized Method of Moments) with GARCH
  20. 三维重建 PyQt Python VTK 医学图像的可视化 vtkImageView2三视图(横断面,冠状面,矢状面)

热门文章

  1. 做程序员必须懂英语吗?_您必须懂英语才能成为程序员吗?
  2. 这10个奇妙的Python库,你必须要试试!
  3. 畅想未来计算机的绘画作品小学生,畅想未来儿童画绘画作品
  4. 五大主流浏览器的内核,前端在IE浏览器中常见的兼容问题
  5. linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...
  6. PKI和数字证书基本原理
  7. blog微服务架构代码_DDD+微服务大型案例:Uber如何从复杂的RPC微服务转向面向业务领域的微服务架构DOMA? -优步工程博客...
  8. 论文翻译:Speech Super Resolution Generative Adversarial Network
  9. 情人节!原来程序员也可以那么浪漫!
  10. 2018河南省第十一届ACM省赛之旅。。。