一点一点看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原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...
随机推荐
- ES6的新知识点
一.变量 原有变量: var的缺点: 1.可以重复声明 2.无法限制修改 3.没有块级作用域 新增变量: let :不能重复声明,变量-可以修改,块级作用域 const:不能重复声明,变量-不可以修改 ...
- Django Cookie于Session
一.Cookie与Session由来 因为Http协议的特性,每一次来自用户浏览器的请求都是无状态且独立的,通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用 ...
- Ant design 项目打包后报错:"Menu(or Flex) is not defined"
我的项目使用了ant-design 和 ant-design-mobile,在测试环境上没问题,但是打包发布之后控制台报错 Menu is not defined Flex is not define ...
- webapi datetime类型序列化成json带T且时间不对问题的解决
在global.asax.cs里加入如下代码: protected void Application_Start() { GlobalConfiguration.Configuration.Forma ...
- ado.net c#基本的增加,修改,删除,查询
自己初次学习用的,各种不规范,注释没写 class AdoDemo { static string strConn = @"Data Source=server1;Initial Catal ...
- androidUI异步消息
private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch ...
- GitHub教程(一) 使用指南
刚进公司上班的时候,技术总监让我熟悉一下Git(分布式版本控制工具)操作命令和GitHub(代码托管平台),说实话之前我也没有具体使用过Git工具,但是GitHub我还是注册过账号的.在练习将本地仓库 ...
- c# FTP操作类(转)
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...
- 配置spark集群
配置spark集群 1.配置spark-env.sh [/soft/spark/conf/spark-env.sh] ... export JAVA_HOME=/soft/jdk 2.配置slaves ...
- 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏
1. 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2. 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...