一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator
一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator
liuyuhang原创,未经允许禁止转载
本文举例使用的是JDK8的API
目录:一点一点看JDK源码(〇)
Comparator为额外实现的比较接口,与类本身无关
该接口在ArrayList的sort中有应用(很多时候都可以用的,只是以此举例)
Comparator接口主要用途有两种,
1、比较有序集合内任意两个元素A、B(完全遍历的compareTo方法,于compare方法内实现)
若A元素小于B元素,则返回1,donothing
若A元素等于B元素,则返回0,donothing
若A元素小于B元素,则返回-1,交换元素位置
若compare方法的返回值遵循以上原则,则进行排序
示例代码如下:
package com.FM.ArrayListStudy; import java.util.ArrayList;
import java.util.Comparator; public class ComparatorInArrayListStudy01 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(12);
list.add(3);
list.add(4);
list.add(3);
list.add(11);
list.add(7);
System.out.println(list);//排序之前的list list.sort(new Comparator<Integer>() {//使用Comparator进行自然排序
@Override
public int compare(Integer one, Integer anotherOne) {
int compareTo = one.compareTo(anotherOne);//正序排序
//int compareTo = anotherOne.compareTo(one);//逆序排序 //比较结果为1则不操作
//比较结果为0则相等
//比较结果为-1则交换位置
System.out.println(anotherOne + " -- " + one + " --- " + compareTo);
return compareTo;
}
});
System.out.println(list);//排序之后的list
}
}
运行结果:

2、依照比较的结果(-1,0,1)进行判断分组
示例代码如下:Apple类
package com.FM.ArrayListStudy;
public class Apple {
private Integer id;
private Integer size;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public Apple(Integer id, Integer size) {
super();
this.id = id;
this.size = size;
}
@Override
public String toString() {
return "Apple [id=" + id + ", size=" + size + "]";
}
}
示例代码如下:利用Comparator接口分组
package com.FM.ArrayListStudy; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; public class ComparatorInArrayListStudy02 {
public static void main(String[] args) {
ArrayList<Apple> list = new ArrayList<Apple>();
list.add(new Apple(1, 81));
list.add(new Apple(2, 76));
list.add(new Apple(3, 91));
list.add(new Apple(4, 84));
list.add(new Apple(5, 79));
list.add(new Apple(6, 87));
list.add(new Apple(7, 85));
list.add(new Apple(8, 83));
list.add(new Apple(9, 91));
System.out.println(list);//排序之前的list List<List<Apple>> disPartList = disPart(list,new Comparator<Apple>(){
@Override
public int compare(Apple o1, Apple o2) {//这里写具体的分组接口,分组方式可以使用对象内的属性的组合方式
if(o1.getSize()/10 == o2.getSize()/10){//将苹果Apple按照size分组,每10个size分为一组
return 0;
}
return 1;
}
});
for(List lis : disPartList){//分别遍历每一组
System.out.println(lis);
}
} /**
* 按照comparator进行分组的方法
*/
public static <T> List<List<T>> disPart(List<T> list, Comparator<? super T> c) {
ArrayList<List<T>> resultList = new ArrayList<List<T>>();
for (T t : list) {
boolean flag = false;
for (int i = 0; i < resultList.size(); i++) {
if (c.compare(t, resultList.get(i).get(0)) == 0) {// 若匹配成功则加入resultList中的子元素
flag = true;
resultList.get(i).add(t);
break;
}
}
if (flag == false) {// 若flag为false则将此元素加入resultList为新元素
List<T> listIn = new ArrayList<T>();
listIn.add(t);
resultList.add(listIn);
}
}
return resultList;
}
}
运行结果:

分组的方式很多,很多人也喜欢自己写遍历来分组
利用好Comparator接口进行分组能更好的重用,也更容易扩展!
以上!!
一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator的更多相关文章
- JDK1.8源码(五)——java.util.ArrayList 类
关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList
一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历
一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看J ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...
- JDK1.8源码(五)——java.util.Vector类
JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html
- JDK1.8源码(一)——java.util.ArrayList
ArrayList 定义 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复. public class ArrayList<E> extends Abstr ...
- JDK1.8源码(六)——java.util.ArrayList类
ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Clonea ...
- 一点一点看JDK源码(〇)
一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...
随机推荐
- java 阿里云接口实现发送短信验证码
此刻自己做的小项目中,需要用到手机发送短信验证码实现注册功能,于是就去阿里云注册了账号,并实现随机发送验证码的功能 第一步:在阿里云官网登录注册 已有支付宝或淘宝的账号可以直接登录,最后需要实名认 ...
- 20个实用的javascript技巧及实践(一)
在本篇文章中,我们将会向大家分享JavaScript开发中的小技巧.最佳实践和实用内容,不管你是前端开发者还是服务端开发者,都应该来看看这些编程的技巧总结,绝对会让你受益匪浅的. 文中所提供的代码片段 ...
- MongoDB 创建集合
createCollection() 方法 MongoDB db.createCollection(name, options) 是用来创建集合. 语法: 基本的 createCollection() ...
- 基础架构之日志管理平台搭建及java&net使用
在现代化的软件开发流程中,日志显得非常的重要,不可能再零散的游离在各个项目中,等查看日志的时候再登录服务器去到特定的目录去查看,这显然很繁琐且效率低下,所有整合一套日志管理平台,也显得非常重要,这篇文 ...
- 基础架构之Docker私有库
由于项目要容器化,所有搭建自己的镜像库也是很有必要的,不然发到直接使用官方的镜像库,速度绝对能让你头疼,这篇文章就介绍搭建自己的镜像私有库. (一) 环境要求 Centos 7.5.1804 Doc ...
- RoadFlowCore工作流2.8.1 更新日志
1.2.8.1更新了2.8刚发布的一些小BUG. 2.2.8.1增加了移动端,基于微信企业号或企业微信. 详细请参阅官方网站:roadflow.net
- Linux系统学习之系统启动的5个过程
Linux 系统启动过程 Linux系统的启动过程可以分为5个阶段: 1. 内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动.操作系统接管硬件以后 ...
- 使用NSURLConnection实现大文件断点下载
使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...
- 【源码分析】cocostudio场景编辑器的触发器逻辑
去看场景编辑器的差不多都可以看到有模拟器的设置(菜单栏的设置).默认是选择cocostudio安装路径中的Simulator.exe这个模拟器,看官网介绍是自己可以选择模拟器,而且公开源代码可以按需设 ...
- HTTP常用状态码大全
HTTP状态码对照表 HTTP response codes 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码 ...